【问题标题】:sorting output of find before running the command in -exec在 -exec 中运行命令之前对 find 的输出进行排序
【发布时间】:2016-07-22 12:39:42
【问题描述】:

我有一系列目录,其中包含多个文件名为 001.mp3、002.mp3、...、030.mp3 的 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

有时这可行,我会得到一个文件,其中所有“曲目”的顺序都正确。

但是,我经常会得到一个文件,其中所有“曲目”都以相反的顺序排列,这确实不好。

我不明白为什么脚本的不同运行之间的顺序会有所不同,因为所有目录都包含相同的文件名集。我翻遍了手册页,但找不到 find 的排序选项。

我可以运行 find . -iname '*.mp3' | sort -n >> temp.txt 将文件放入一个临时文件中,然后尝试循环遍历该文件,但我无法让它与 lame 一起使用。

有什么方法可以在 find 运行 exec 之前进行排序?我可以在此处和其他地方找到大量使用 -exec ls 执行此操作的示例,但在需要使用 exec 执行更复杂的操作的地方却找不到。

【问题讨论】:

  • 在这里突破我自己 bash 能力的界限,但我可以做类似find . -iname '*.mp3' | sort -n | xargs <something_here> 的事情吗?如果是这样,我将如何重新安排蹩脚的命令来接受输入?
  • temp.txt 包含完整路径还是仅包含一系列文件名?
  • 如果可能的话,我宁愿不使用临时文件。但它可能被构造为包含任何类型的文件名。

标签: bash find lame


【解决方案1】:
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 以确保即使您的文件名包含换行符,管道仍然有效。

【讨论】:

  • sort -n 更改为 sort -zn 因为默认情况下排序返回换行符分隔的记录
  • 我无法建议编辑 -- 至少应添加 6 个符号))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多