2011-12-16 35 views
3

我想連接名稱不包含「_BASE_」的文件。我認爲這將是沿線的某處...unix:如何連接grep中匹配的文件

ls | grep -v _BASE_ | cat > all.txt 

貓的部分是我沒有得到正確的。任何人都可以給我一些關於這個的想法嗎?

回答

4

試試這個

ls | grep -v _BASE_ | xargs cat > all.txt 
2

可以忽略文件的使用--ignore選項ls,然後將它們的貓到一個文件中。

ls --ignore="*_BASE_*" | xargs cat > all.txt 

你也可以做,沒有xargs

cat $(ls --ignore="*_BASE_*") > all.txt 

UPD: 戴爾奼glund注意到,類似的文件名 「某些文件」 將顯示爲兩個文件名, 「一些」 和「文件」。爲避免您可以使用--quoting-style=WORD選項,當WORD可以是shellescape

例如,如果--quoting-style=shell某些文件將打印爲「某些文件」並將被解釋爲一個文件。

另一個問題是輸出文件可能與ls ed文件中的一個相同。我們也需要忽略它。

所以答案是:

outputFile=a.txt; ls --ignore="*sh*" --ignore="${outputFile}" --quoting-style=shell | xargs cat > ${outputFile} 
+0

如果任何文件名包含空白,這些都不起作用。像「Some File」這樣的文件名在傳遞給cat時會顯示爲兩個文件名「Some」和「File」。 – 2011-12-16 09:21:39

+0

修復答案 – 2011-12-16 11:58:37

1

如果你想也子目錄中的文件,'發現」是你的朋友:

find . -type f ! -name '*_BASE_*' ! -path ./all.txt -exec cat {} >> all.txt \+ 

它會搜索當前目錄及其子目錄中的文件,它只找到文件(-type f),忽略與通配符模式*_BASE_*匹配的文件,忽略all.txt,並以與xargs相同的方式執行cat