如何对给定目录中的每个文件运行命令?

usr*_*212 0 linux bash mp4box

我正在使用mp4box在 MP4 文件上移动 MOOV 原子。

问题是,我将在给定文件夹中有 6 个文件,并且我不想inter 500单独运行该命令六次。

是否可以mp4box -inter 500 *在目录中执行类似操作,以便对该文件夹中的所有 mp4 文件运行该命令?

ter*_*don 5

您可以使用 的-exec选项find。此处,'{}'替换为每个 MP4 文件的文件名。这将处理各种文件名,甚至那些包含空格或换行符的文件名。您需要提供-maxdepth 1仅搜索当前目录。

find . -iname "*.mp4" -maxdepth 1 -exec mp4box -inter 500 '{}' \;
Run Code Online (Sandbox Code Playgroud)

另一种更复杂的方法是将输出从管道输送find到带有read. 在这里,每个文件都是由NUL字符分隔的,你需要告诉read在这个字符上拆分输入,这是通过-d ''. 您还需要引用变量"$file",以便保留名称中的空格或通配符。

find . -iname "*.mp4" -maxdepth 1 -print0 | while IFS= read -d '' -r file; do mp4box -inter 500 "$file"; done
Run Code Online (Sandbox Code Playgroud)

  • 我做了一些更正。`-name` 中的通配模式应该总是被引用。否则 `*` glob 将在 `find` 看到它之前被扩展。这意味着如果您在当前目录之外的另一个目录中搜索,或者搜索比一个级别更深的目录,该命令将失败。此外,`-exec` 选项处理任何类型的文件名。使用 `xargs` 并不是真正必要的——`while` 循环效果更好,但这里的输出应该是空分隔的。 (2认同)