2011-05-18 52 views
2
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的已排序的,未排序的列表。bash:嵌套替换仅将最后一个值分配给变量

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

您正在通过重载操作符使这变得不必要的复杂。您可以将其嵌套大约三个级别,并保持功能。

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 
+0

非常,非常非常好!一个答案不仅仅是帮助我,而是改善我的bash!谢谢! – Christian 2011-05-18 11:19:39

+0

Weeellll,实际上您的短版本只输出最后一个条目,与我的示例相同。如果我在while循环中'echo',那么长版本会很好地输出所有内容,但是我不能将所有内容都分配给一个变量,因为该变量不会在while循环中“生存”。最后,我需要上述两种变体“comp”将输出相互对比。 – Christian 2011-05-18 12:56:09

+0

您确定切割,排序,uniq和egrep的组合实际上首先返回多个项目吗?当您在变量赋值之外手动运行该行时会发生什么? – Caleb 2011-05-18 13:00:07