使用输入列表和部分文件路径查找和复制文件

使用输入列表和部分文件路径查找和复制文件

names.list我有一个仅包含名称的文件名列表。这些文件分散在我的系统中的各个子文件夹中,但结构通常是

uniquename/uniquename2/spades/filtered/filename

常数是spades/filtered

我已经用过以下命令从一个目录移动文件时

xargs -a file_list.txt cp -t /path/to/dest

我在使用时发现了这个线程通配符/部分文件名s

find . -path \*content/docs/file.xml

我尝试像这样组合它们

find . -path \*spades/filtered/ | xargs -a names.list cp -t $HOME/destination/

但我收到以下错误:

cp: cannot stat `filename': No such file or directory

tldr:我想使用仅输入名称列表和部分文件路径来复制文件

答案1

通过 for 循环遍历文件名并将它们附加到查找模式,使用 exec 句柄复制:

for i in $(<names.list)
do
    find . -path \*spades/filtered/"$i" -type f -exec cp -t "$HOME/destination/" {} \;;
done

编辑:感谢 Rakesh Sharma 的回答,将循环体替换为:

find . -mindepth 5 -maxdepth 5 -path "*/spades/filtered/$i" -type f -exec cp -t "$HOME/destination/" {} +;

加快速度。

答案2

您可以取消for循环并执行以下操作xargs

xargs -a names.list -L 1 -I @ find . -path \*/spades/filtered/@ -type f -exec cp -fpvt "$HOME/destination/" {} +

假设使用 GNU xargs、find 和 cp 实用程序。

-a将一次读取一行文件名。

-L 1选项使xargs传递一个换行符分隔的参数来查找。

-I @选项将压缩该符号中的参数,@该符号可以被困在由 调用的实用程序中xargs,在本例中为find。更具体地说,-path选项find是由@名称.list 读取的每一行的符号修改的。

相关内容