我有一个包含数百个文件的目录(比如~/dir/)。其中一半将以字符串"ABC"开头,即它们将被称为ABC_0.csv、ABC_1.csv、ABC_2.csv等。
我的目标是编写一个shell脚本,将这些"ABC"文件中的每一个合并到一个更大的文件中,我称之为"master_ABC"。
我知道如何合并它们,但我不知道如何编写一个shell脚本,该脚本只接受名称以"ABC"开头的文件(注意:~/dir/中还有其他我不感兴趣并希望避免的文件)。
此外,"ABC"文件的数量每天都会有所不同。
使用通配符*
展开以获得不同的文件ABC_1.csv
等
cat ABC_*.csv > master_ABC.csv
您可以捕获列表中的所有文件,然后用append(>>)将cat添加到主文件
files=`ls ABC*csv`
for f in $files
do
echo $f
cat $f >> master_ABC.csv
done
您可以为此使用通配符*。
#!/bin/bash
cat ~/dir/ABC*csv > master_ABC
在while
循环中使用ls
(或find
)和grep
:
ls | grep 'ABC_.*.csv$' | while read fn ; do cat $fn >> master_ABC.csv ; done
或者使用find
(尤其是当您需要递归遍历子目录时):
find . -type f -name 'ABC*.csv' | while read fn ; do cat $fn >> master_ABC.csv ; done
请注意,grep
接受正则表达式,而find
需要通配符字符串。
我建议在这种情况下避免使用*
,因为它不适用于很长的文件列表,而且如果任何文件名包含空格字符,它也会失败。