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 读取的每一行的符号修改的。