在 -exec 中的命令 运行 之前对 find 的输出进行排序
sorting output of find before running the command in -exec
我有一系列包含多个 mp3 文件的目录,文件名分别为 001.mp3、002.mp3、...、030.mp3。
我想做的是将它们按顺序放在一个 mp3 文件中,并向其中添加一些元数据。
这是我目前拥有的(为清楚起见,删除了一些变量定义):
#!/bin/bash
for d in */; do
cd $d
find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
cd ..
done
有时这行得通,我得到一个包含所有 "tracks" 且顺序正确的文件。
然而,我经常会得到一个文件,其中所有 "tracks" 的顺序都是相反的,这确实不好。
我不明白的是为什么脚本的不同 运行 之间的顺序不同,因为所有目录都包含同一组文件名。我翻遍了手册页,找不到用于查找的排序选项。
我可以 运行 find . -iname '*.mp3' | sort -n >> temp.txt
将文件放在一个临时文件中,然后尝试循环遍历它,但我无法让它与 lame 一起工作。
有什么方法可以在找到 运行 执行程序之前进行排序?我可以在这里和其他地方找到大量使用 -exec ls
执行此操作的示例,但找不到需要使用 exec 执行更复杂的操作的示例。
find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
未经测试但可能值得一试。
通常 xargs
将参数附加到您提供的命令的末尾。 -I
选项告诉它替换给定的字符串(在本例中为 {}
)。
编辑: 我添加了 -print0
、-z
、-0
以确保管道仍然有效,即使您的文件名包含换行符。
我有一系列包含多个 mp3 文件的目录,文件名分别为 001.mp3、002.mp3、...、030.mp3。
我想做的是将它们按顺序放在一个 mp3 文件中,并向其中添加一些元数据。
这是我目前拥有的(为清楚起见,删除了一些变量定义):
#!/bin/bash
for d in */; do
cd $d
find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
cd ..
done
有时这行得通,我得到一个包含所有 "tracks" 且顺序正确的文件。
然而,我经常会得到一个文件,其中所有 "tracks" 的顺序都是相反的,这确实不好。
我不明白的是为什么脚本的不同 运行 之间的顺序不同,因为所有目录都包含同一组文件名。我翻遍了手册页,找不到用于查找的排序选项。
我可以 运行 find . -iname '*.mp3' | sort -n >> temp.txt
将文件放在一个临时文件中,然后尝试循环遍历它,但我无法让它与 lame 一起工作。
有什么方法可以在找到 运行 执行程序之前进行排序?我可以在这里和其他地方找到大量使用 -exec ls
执行此操作的示例,但找不到需要使用 exec 执行更复杂的操作的示例。
find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
未经测试但可能值得一试。
通常 xargs
将参数附加到您提供的命令的末尾。 -I
选项告诉它替换给定的字符串(在本例中为 {}
)。
编辑: 我添加了 -print0
、-z
、-0
以确保管道仍然有效,即使您的文件名包含换行符。