问题描述
我在三个不同目录中都有大量文件。对于其中的某些文件,另一个目录中存在一个具有相同名称的文件。其他文件仅存在于一个目录中。我想使用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
来访问。