2017-12-27 349 views
2

的文件列表我有一個文件列表,我得到通過執行這樣的:ls core_* | sort -n -t _ -k 2遍歷猛砸

,給了我這樣的事情:

core_20171201142359.csv core_20171202131548.csv core_20171203141112.csv

的目標是獲得一個單個文件,在其中按順序追加每個單個文件的所有內容。

因此,我想逐一打開每個文件,將其內容複製到另一個文件中,將以前的源文件移動到另一個目錄以便保存並繼續。

要總是得到第一個文件,我使用ls core_* | sort -n -t _ -k 2 | head -1,我需要循環所有這些文件。

如何知道何時不需要處理更多文件?

+0

@Cyrus它會將文件的名稱寫入new_file而不是每個文件內容,不是嗎? –

+0

@ViktorKhilin:很好。 – Cyrus

+2

糾正我,如果我錯了,日期格式已經確保您需要正確的順序...'貓core_ * >> single_file.csv'應該做的伎倆......移動文件,'mv core_ */bkp/path' – Sundeep

回答

0
for file in $(ls core_* | sort -n -t _ -k 2) 
do 
    cat ${file} >> one_big_file.csv 
    mv ${file} /anywhere/you/want 
done 

將讀取每個文件,所有行復制到one_big_file.csv,只刪除讀取文件到/任何地方/你/想

+0

非常感謝!對於我對bash的瞭解很少,我認爲你的回答允許我實現日誌記錄。 – riccardocasali

+2

關於使用'ls'在'讀取'的缺陷這個http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29 – ULick

+1

[引用你的變量](https:/ /unix.stackexchange.com/q/171346/4667) - >'cat「$ file」...','mv「$ file」...' –

1

你可以試試這個:

ls core_* | sort -n -t _ -k 2 | while read f; do cat $f >> total.csv; done 

而且旁邊與cat你可以執行move

1

對於bash,你可以將文件名存儲在一個數組中:

files=(core_*) 

然後,第一項是

first="${files[0]}" 

你還可以用這個迭代(引號是絕對必需的)

for file in "${files[@]}"; do 
    echo "$file" 
done 

或者,如果你需要做一些事情的所有文件一次:

cat "${files[@]}" > core_all.csv 

但如果是這樣的話,你不需要將它們存儲在一起

cat core_* > core_all.csv