bash:使用文件名列表跨目录连接匹配文件并将所有文件保存在新目录中
bash: use list of file names to concatenate matching files across directories and save all files in new directory
我在三个不同的目录中找到了大量文件。对于其中一些文件,另一个目录中存在同名文件。其他文件只存在于一个目录中。我想使用 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 "[=11=]" >> new_dir/"${0##*/}"'
在上面的命令中,find
之外的文件名以零分隔保留 (-print0
),并且 xargs
也接受零分隔列表 (-0
).对于每个参数 (-n1
),执行以下命令。我们调用 sh -c 'command'
是为了方便在其中使用子字符串删除,我们可以访问 xargs
提供的参数作为 [=20=]
.
我在三个不同的目录中找到了大量文件。对于其中一些文件,另一个目录中存在同名文件。其他文件只存在于一个目录中。我想使用 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 "[=11=]" >> new_dir/"${0##*/}"'
在上面的命令中,find
之外的文件名以零分隔保留 (-print0
),并且 xargs
也接受零分隔列表 (-0
).对于每个参数 (-n1
),执行以下命令。我们调用 sh -c 'command'
是为了方便在其中使用子字符串删除,我们可以访问 xargs
提供的参数作为 [=20=]
.