bash:嵌套替换仅将最后一个值赋给变量

时间:2011-05-18 10:19:33

标签: bash command substitution

for f in $(for i in $(find Balzac/ -iname "20??????.txt"); do echo $i; done); do cat $f|cut -c 10-21; done|sort|uniq|egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3"

从我们使用的基于.txt的播放列表中生成一个排序的,未列出的所有mp3的列表。

a=$(for f in $(for i in $(find Balzac/ -iname "20??????.txt"); do echo $i; done); do cat $f|cut -c 10-21; done|sort|uniq|egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3")

虽然只包含该列表的最后一个值。

知道为什么以及如何在我的变量中使用整个列表?我迷失了......

最后,我需要上面的两个变体来比较/区分输出,看看两个目录中包含的文件有什么不同。

1 个答案:

答案 0 :(得分:1)

您通过重载运算符使这变得不必要地复杂化。您可以将其嵌套大约三个级别并保持功能。

a=$(find Balzac/ -iname "20??????.txt" -exec cat {} + | cut -c 10-21 | sort | uniq | egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3")

事实上,我猜你接下来要做的就是迭代这些文件。如果是这样,你可以跳过变量赋值并使这样的内容可读:

find Balzac/ -iname "20??????.txt" -exec cat {} + |
    cut -c 10-21 |
    sort | uniq |
    egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3" |
    while read file; do
        #Do something with $file
    done