2015-06-11 34 views
3

我有一個文件夾中有2800個.txt文件,我需要刪除每個文件的第一行。除了以.txt結尾的事實之外,這些文件的名稱都是不同的。刪除文件夾中的所有文件的第一行(在Ubuntu上)

,纔有可能做到這一點,同時保持相同的文件名(而不是發送輸出(無文件的第一行)到另一個文件)...

+0

沿着'find/path -name * .txt -exec sed -i'1d''{}'行;'應該這樣做。 (先試一下測試目錄中的一部分文件) – Tensibai

回答

2

你可以做一個bash腳本。事情是這樣的:

#!/bin/bash 
for filename in *; 
do 
    tail -n +2 "${filename}" 
done 

的命令行運行它:$ <script_file.sh>

用一粒鹽拿着這個。我實際上並沒有在* nix機器上運行。請參閱here for a variety of ways刪除文件的第一行。另外請注意,如果性能對您很重要,tail應該比sed快得多。

+0

這個工作完全謝謝你! – SparksHallow

+0

不客氣。你沒有足夠的代表投票,但不要忘記接受! –

3

像這樣的伎倆

sed -i '1d' *.txt 

其中-i是就地編輯

編輯:ADITION

請也試試這個

time sed -i '1d' *.txt 

,並與其他解決方案比較(只需要添加時間)[肯定會嘗試一些備份文件]

0

對於一個小的文件,我會寫是

for f in *.txt; do sed 1d "$f" >tmpfile; mv tmpfile "$f"; done 

對於一個足夠大的文件,但是,這是行不通的,因爲shell將擴大到*.txt參數名單太長。

在這種情況下(這聽起來像你的情況下),更好的方法是

ls | grep '.txt$' | while read f; do sed 1d "$f" >tmpfile; mv tmpfile "$f"; done 

你應該知道,但是,也有在原則問題,這(如@EdMorton在評論中強調對這個答案的早期版本)。一個是,如果你不幸有一個名字以.txt結尾的目錄(如果你確實需要,你可以用test -f來處理)。另一個是如果在一個文件名中有一些奇怪的字符(例如\n,或者其他類型的引號),read可能會有問題。您可以通過撥動IFS(請參閱註釋)來處理此類事情,但最好快速瀏覽一下您正在處理的文件,並首先修復這些不良文件名。

你不應該做的是ls *.txt | ...,因爲如果文件的數量足夠長,for f in *.txt; do ...將無法​​正常工作,那麼ls *.txt也不會工作。


還有更復雜的事情可以做。

find . -type f -name \*.txt | while read f; do ... 

那選擇具體文件.txt結束,但我總能找到的選項file不整潔鍵入或閱讀,感覺ls + grep是整潔這裏。

另一種可能性是

find . -type f -name \*.txt -exec sed -i 1d '{}' \; 

這是相當強勁,但最喜歡的不平凡的file命令,它結束了看起來像一個爛攤子,你必須熟記find的非明顯的語法。此外這是行不通的,除非你的sed支持無參數-i選項(POSIX sed沒有-i,以及OS X和其他BSD系統的sed有效需要擴展到指定)。另外,這種方法僅限於單一命令,因此在您需要對文件做更多操作的情況下無法使用。

+0

在給定各種文件名的情況下,這會以許多有趣的方式失敗。不要這樣做。 google解析ls,引用shell變量,不寫shell循環,等等。 –

+0

@EdMorton是的,當然它對半病態文件名(包括帶空格的文件名在很多情況下)並不是很強大,我幾乎肯定會不要將它寫入未經監視的腳本中,但考慮到我可以先看一下我想要處理的文件列表,這就是我認爲足夠好的一個文件。也就是說,引用'$ f'是一個很好的反應,並且不會馬虎,所以我會編輯答案以便將它們放入。 –

+0

它是shell的基礎 - 不分析ls的輸出,總是引用你的變量,除非你有一個非常具體的目的,並且完全理解這些影響,並且總是使用'IFS ='和'-r'(例如'while IFS = read -rf')寫入讀命令,除非你有非常具體的目的,並充分理解其效果。按照這些基本規則正確的方式做到這一點非常容易,所以爲什麼要這樣做,然後說「因爲它足夠好」。 –

相關問題