2011-05-18 49 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