2017-12-27 517 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