在bash中使用find命令操作字符串(文件扩展名)
在bash中使用find命令操作字符串(文件扩展名)
我在bash中操作字符串时遇到了困难。我希望重新编写文件扩展名。\n我在Downloads目录中有以下两个文件:\n
- \n
- Example 001.mkv
- Example 002.mkv
\n
\n
\n使用下面的脚本,我总是得到相同的文件名,没有将.mkv重写为.mp4。\n
find /Downloads -name \*.mkv -execdir echo $(file={}; echo ${file/mkv/mp4};) \;
\n我知道这不足以重新格式化文件,但这个脚本是传递给FFMPEG的更大脚本的一部分。\n以下是带有FFMPEG的完整命令。\n
find /Downloads -name \*.mkv -execdir ffmpeg -i {} -vcodec copy -acodec copy $(file={}; echo ${file/mkv/mp4};) \;
在bash中使用find命令操作字符串(文件扩展名)时,可能会遇到一些问题。出现这些问题的原因是我们想要使用bash -c来执行命令,但是在这种情况下,我们需要特别注意语法和引号的使用。
解决这个问题的方法是使用以下命令:
find /Downloads -name \*.mkv -execdir bash -c 'file={}; echo ${file/.mkv/.mp4}' \;
这个命令的作用是在/Downloads目录中查找所有扩展名为.mkv的文件,并将其扩展名替换为.mp4。执行命令时,需要注意以下几点:
1. 使用-execdir而不是-exec。这是为了确保在文件所在的目录中执行命令,而不是在当前目录中执行。
2. 在-execdir之后的bash -c命令中,需要将要操作的文件路径赋值给一个变量file。这样我们就可以在后面的操作中使用这个变量。
3. 在echo命令中,使用${file/.mkv/.mp4}来将.mkv替换为.mp4。这是一种bash中操作字符串的方法。
通过上述方法,我们可以在bash中使用find命令操作字符串(文件扩展名),并实现我们想要的功能。
在bash中使用find操作字符串(文件扩展名)的问题是,exec和execdir通常用于实际执行命令,而不是打印有关找到的文件的信息。有几种方法可以解决这个问题,下面是其中一种方法。
首先,可以尝试使用rename命令来对文件进行重命名,该命令可以使用正则表达式进行替换。这需要将所有要重命名的文件放在同一个文件夹/Downloads中(语法可能会根据您发行版附带的rename实现而有所不同)。
假设mkv文件也存在于/Downloads的子目录中:
ls *.mkv a.mkv b.mkv rename .mkv .mp4 *.mkv ls *.mp4 a.mp4 b.mp4
如果要处理/Downloads目录及其子目录中的所有mkv文件,可以使用find命令:
find . -type f -name "*.mkv" ./sundir/d.mkv ./sundir/c.mkv ./a.mkv ./b.mkv find -type f -name "*.mkv" -exec rename .mkv .mp4 {} \; find . -type f -name "*.mp4" ./sundir/c.mp4 ./sundir/d.mp4 ./b.mp4 ./a.mp4
使用find命令,可以找到/Downloads目录及其子目录中所有扩展名为mkv的文件,并使用rename命令将其扩展名改为mp4。最后,使用find命令再次找到所有扩展名为mp4的文件,以验证重命名是否成功。