【问题标题】:bash shell: recursively search folder and subfolders for files from listbash shell:递归搜索文件夹和子文件夹中的文件
【发布时间】:2016-05-12 14:55:37
【问题描述】:

到目前为止,当我想从列表中收集文件时,我一直在使用包含完整路径的列表并使用:

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

但是,我希望能够递归搜索文件夹及其子文件夹,并复制仅包含文件名(不是完整路径)的纯文本列表中的所有文件。

我该怎么做呢?

谢谢!

【问题讨论】:

  • 使用 find 命令。
  • 您希望从哪里找到文件夹?当前目录以及将文件复制到哪里?举个例子

标签: bash shell recursion


【解决方案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 \+

【讨论】:

  • 很好:D。这也将处理一个名为 -name 的文件。
  • 这个解决方案对我不起作用,因为我收到了权限被拒绝错误。我猜的-exec?
  • 听起来更像cp 无法访问您找到的一个或多个文件。没有确切的错误信息很难说。在cp 之前尝试echo
【解决方案2】:

试试类似的东西

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

【讨论】:

  • 你的xargs cp好像有问题,复制/粘贴错误?
  • 完美!我感谢每个人的帮助,并没有冒犯其他人,但迈克尔的回答立即对我来说最有意义......更重要的是立即奏效。
  • 抱起来有问题。我需要它只抓取完全匹配的文件,如果不跳过它们。现在,如果我在列表中有一个名为 123456.tif 的文件,并且文件夹中没有匹配的文件,那么它正在抓取 23456.tif 。我该如何解决这个问题?
  • 一个更好的正则表达式可以解决这个问题。 grep -w 足以解决这个特殊问题,但可能会有更麻烦的问题,您无法轻易解决,例如 1-234 匹配 234,即使使用 -w
  • @tripleee 是的,打错了。
【解决方案3】:

使用查找命令。

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。简而言之,您应该使用以空结尾的字符串进行操作。

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多