bash:使用文件名列表来连接目录中的匹配文件,并将所有文件保存在新目录中

问题描述

我在三个不同目录中都有大量文件。对于其中的某些文件,另一个目录中存在一个具有相同名称的文件。其他文件仅存在于一个目录中。我想使用bash将三个目录中的所有文件复制到一个新目录中,但是对于具有多个目录中具有相同名称的文件的文件,我想在保存到新目录之前跨目录合并文件内容

以下是我的文件结构的示例:

ls dir1/
file1.txt
file2.txt
file4.txt

ls dir2/
file2.txt
file5.txt
file6.txt
file9.txt

ls dir3/
file2.txt
file3.txt
file4.txt
file7.txt
file8.txt
file10.txt

使用此示例,我想生成一个包含file1.txt到file10.txt的新目录,但是在新目录中串联了同名文件的内容(例如file2.txt,file4.txt)。

我在我的三个目录中都有一个包含所有文件名的唯一列表(列表中包含每个唯一文件名的单个实例)。到目前为止,我已经拿出代码来从一个目录中获取文件名列表,并将这些文件与第二目录中具有相同名称的文件连接起来,但是我不确定如何使用我的文件名列表作为参考串联和保存文件(而不是第一个目录中ls的输出)。关于如何修改的任何想法?非常感谢!

PATH1='/path/to/dir1'
PATH2='/path/to/dir2'
PATH3='/path/to/dir3'

mkdir dir_new

ls $PATH1 | while read FILE; do

    cat $PATH1/"$FILE" $PATH2/"$FILE" $PATH3/"$FILE" >> ./dir_new/"$FILE"

done

解决方法

您可以这样做:

mkdir -p new_dir

for f in path/to/dir*/*.txt; do
    cat "$f" >> "new_dir/${f##*/}"
done

这是common use,用于通过参数扩展删除子字符串,以便仅使用文件的基名来构造输出文件名。


或者您可以使用find命令来获取文件并为每个文件执行命令:

find path/to/dir* -type f -name '*.txt' -print0 |\
xargs -0 -n1 sh -c 'cat "$0" >> new_dir/"${0##*/}"'

在上述命令中,find中的文件名以零分隔(-print0)保留,xargs也接受零分隔的列表(-0)。对于每个参数(-n1,将执行以下命令。为了方便起见,我们调用sh -c 'command'来使用其中的子字符串删除功能,我们可以将xargs提供的参数作为$0来访问。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...