外壳脚本:使用基于部分文件名的文件



我有一个包含数百个文件的目录(比如~/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需要通配符字符串。

我建议在这种情况下避免使用*,因为它不适用于很长的文件列表,而且如果任何文件名包含空格字符,它也会失败。

最新更新