2013-02-15 31 views
1

我一直在按照這篇文章中的說明連接目錄中的文件:Unix: merge many files, while deleting first line of all files,但它無法正常工作。總之,這是正在使用的命令:如何輸出合併到文件?

find . -name "*.extension" | xargs -n 1 tail -n +2 

我嘗試將名稱附加到該文件,並重定向這樣的:

find . -name "*.extension" | xargs -n 1 tail -n +2 > concatenated.csv 

但這只是抓住了第一個文件。難道我做錯了什麼?我很不熟悉這些命令。

+1

如果你的文件名都沒有空格或引號,這應該可以正常工作。你有沒有收到任何錯誤信息?找到了。 -name「* .extension」輸出你期望的所有文件? – 2013-02-15 21:43:35

+0

他們有空白,我得到錯誤。我只需要刪除空格? – derigible 2013-02-15 21:47:10

+1

下面有兩個工作答案,不需要重命名。對未來友好的提示:包括你得到的任何錯誤信息,因爲這樣可以更容易地確定問題所在。 – 2013-02-15 21:54:50

回答

3

問題是你的文件包含空格或引號,默認情況下xargs不喜歡。如果您使用GNU版本的find和xargs,則可以使用

find . -name "*.extension" -print0 | xargs -0 -n 1 tail -n +2 > concatenated.csv 

安全地處理所有文件名。

+1

我還發現,如果您要使用此方法,您必須將輸出放置在不同的目錄中,否則它會將已經連接的文件添加到其自身。只是一個頭腦。 – derigible 2013-02-15 22:27:57

+0

絕對是一個好點。你可以用'-name「* .csv」排除輸出! -name「concatenated.csv」-print0「'如果你想寫入同一個目錄 – 2013-02-16 01:34:43

2

對於這樣一個簡單的命令,你可以跳過xargs,只是使用-execdir主:

find . -name "*.extension" -execdir tail -n +2 '{}' \; > concatenated.csv 

凱文的回答啓發,你也可以使用

find . -name "*.extension" -execdir tail -q -n +2 '{}' + > concatenated.csv 

將只運行tail一次在所有文件上,而不是每個文件一次。

+0

我無法得到這個工作,它告訴我'-execdir'不是一個有效的謂詞。 – derigible 2013-02-15 21:57:34

+0

嗯,這就是奇數,你可以用'-exec'試試,這可能更標準一些,在這個例子中,兩者之間應該沒有區別 – chepner 2013-02-15 22:00:03

1

而不是分別在每個文件上使用tail,您可能想要使用另一個可以一次處理更多文件的工具。例如awk

find . -name '*.extension' -exec awk 'FNR > 1' + >concatenated.csv 
+0

你可以用'tail -q'來做同樣的事情(我不會這麼做有想過檢查你是否沒有發佈這個答案,所以+1)。 – chepner 2013-02-15 22:02:47