我在三个不同的目录中找到大量文件。对于其中的某些文件,另一个目录中存在一个具有相同名称的文件。其他文件仅存在于一个目录中。我想使用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
这是带有参数扩展的子字符串删除的常用用法,以便仅使用文件的基本名称来构造输出文件名。
或者,您可以使用find
命令获取文件并为每个文件执行命令:
find path/to/dir* -type f -name '*.txt' -print0 |\
xargs -0 -n1 sh -c 'cat "$0" >> new_dir/"${0##*/}"'
在上面的命令中,out中的文件名find
以零分隔符(-print0
)保留,并且xargs
还接受零分隔列表(-0
)。对于每个参数(-n1
),将执行以下命令。我们呼吁sh -c 'command'
为方便使用子去除里面就有,我们可以访问所提供的参数xargs
为$0
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句