我有一個文件夾中有2800個.txt文件,我需要刪除每個文件的第一行。除了以.txt結尾的事實之外,這些文件的名稱都是不同的。刪除文件夾中的所有文件的第一行(在Ubuntu上)
,纔有可能做到這一點,同時保持相同的文件名(而不是發送輸出(無文件的第一行)到另一個文件)...
我有一個文件夾中有2800個.txt文件,我需要刪除每個文件的第一行。除了以.txt結尾的事實之外,這些文件的名稱都是不同的。刪除文件夾中的所有文件的第一行(在Ubuntu上)
,纔有可能做到這一點,同時保持相同的文件名(而不是發送輸出(無文件的第一行)到另一個文件)...
你可以做一個bash腳本。事情是這樣的:
#!/bin/bash
for filename in *;
do
tail -n +2 "${filename}"
done
的命令行運行它:$ <script_file.sh>
用一粒鹽拿着這個。我實際上並沒有在* nix機器上運行。請參閱here for a variety of ways刪除文件的第一行。另外請注意,如果性能對您很重要,tail
應該比sed
快得多。
這個工作完全謝謝你! – SparksHallow
不客氣。你沒有足夠的代表投票,但不要忘記接受! –
像這樣的伎倆
sed -i '1d' *.txt
其中-i是就地編輯
編輯:ADITION
請也試試這個
time sed -i '1d' *.txt
,並與其他解決方案比較(只需要添加時間)[肯定會嘗試一些備份文件]
對於一個小的文件,我會寫是
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
有效需要擴展到指定)。另外,這種方法僅限於單一命令,因此在您需要對文件做更多操作的情況下無法使用。
在給定各種文件名的情況下,這會以許多有趣的方式失敗。不要這樣做。 google解析ls,引用shell變量,不寫shell循環,等等。 –
@EdMorton是的,當然它對半病態文件名(包括帶空格的文件名在很多情況下)並不是很強大,我幾乎肯定會不要將它寫入未經監視的腳本中,但考慮到我可以先看一下我想要處理的文件列表,這就是我認爲足夠好的一個文件。也就是說,引用'$ f'是一個很好的反應,並且不會馬虎,所以我會編輯答案以便將它們放入。 –
它是shell的基礎 - 不分析ls的輸出,總是引用你的變量,除非你有一個非常具體的目的,並且完全理解這些影響,並且總是使用'IFS ='和'-r'(例如'while IFS = read -rf')寫入讀命令,除非你有非常具體的目的,並充分理解其效果。按照這些基本規則正確的方式做到這一點非常容易,所以爲什麼要這樣做,然後說「因爲它足夠好」。 –
沿着'find/path -name * .txt -exec sed -i'1d''{}'行;'應該這樣做。 (先試一下測試目錄中的一部分文件) – Tensibai