2016-05-12 63 views
0

文件夹和子文件夹直到现在,当我想我一直在使用一个包含完整路径列表,并使用从列表中收集的文件:的bash shell:递归搜索从列表

cat pathlist.txt | xargs -I % cp % folder 

不过,我想就像能够递归搜索文件夹和它的子文件夹并复制纯文本列表中的文件名(不是完整路径)中的所有文件一样。

我该怎么做呢?

谢谢!

+0

使用find命令。 – 123

+0

你想从哪里找到文件夹?当前目录以及将文件复制到哪里?提供示例 – Inian

回答

0

试着这么做

find folder_to_search -type f | grep -f pattern_file | xargs -I % cp % folder 
+0

您似乎在xargs cp中存在问题,复制/粘贴错误? – tripleee

+0

完美!我很感谢每个人的帮助,而且对其他人没有冒犯性,但是迈克尔的回答立刻对我最有意义......并且更重要的是马上工作了。 –

+0

举起来是有问题的。我需要它只抓取完全匹配的文件,如果不跳过它们。现在,如果我在列表中有一个名为123456.tif的文件,并且该文件夹中没有匹配的文件,它就会抓取23456.tif。我怎样才能解决这个问题? –

0

使用find命令。

while read line 
do 
find /path/to/search/for -type f -name "$line" -exec cp -R {} /path/to/copy/to \; 
done <plain_text_file_containing_file_names 

假设:

在列表中的文件有标准名称没有,说他们在新行或特殊字符。

注:

如果在列表中的文件具有非标准文件名,TT将是不同的球赛。欲了解更多信息,请参阅find manpage并寻找-print0。总之,你应该使用空字符串来操作。

1

假设您的文件名列表包含裸文件名,因为它适合作为参数传递给find -name,您可以做到这一点。

sed 's/^/-name /;1!s/^/-o /' pathlist.txt | 
xargs -I % find folders to search -type f \(% \) -exec cp -t folder \+ 

如果您cp不支持-t选项源前指定目标文件夹,或者您find不支持-exec ... \+你将需要适应这一点。

只是为了解释这是怎么回事就在这里,输入

test.txt 
radish.avi 
: 

被插入到

find folders to search -type f \(-name test.txt -o -name radish.avi \ 
    -o name : \) -exec cp -t folder \+ 
+0

尼斯:D。这也会处理一个名为'-name'的文件。 – sjsam

+0

该解决方案对我无效,因为我得到了拒绝权限的错误。 -exec我猜? –

+0

听起来更像'cp'无法访问您找到的一个或多个文件。很难说没有确切的错误信息。在'cp'之前用'echo'尝试。 – tripleee