【问题标题】:How to find many files from txt file in directory and subdirectories, then copy all to new folder如何从目录和子目录中的txt文件中找到许多文件,然后将所有文件复制到新文件夹
【发布时间】:2018-04-30 23:54:34
【问题描述】:

我找不到有助于解决这个确切问题的帖子:

在 Mac 终端上,我想读取一个包含文件名的 txt 文件(example.txt),例如: 20130815 144129 865 000000 0172 0780.bmp 20130815 144221 511 000003 1068 0408.bmp ....100 多个

我想在某个文件夹/子文件夹(example_folder)中搜索它们。每次查找后,应将文件复制到新文件夹 x (new_destination)。

非常感谢您的帮助!

雪儿们, 莫

【问题讨论】:

  • 我投票结束这个问题,因为 Stack Overflow 不是代码外包服务。

标签: macos command-line terminal


【解决方案1】:

您可以将管道命令与lsgrepxargscp 组合使用。

所以基本上你从获取文件列表开始

ls

然后您使用egrep -egrep -e 或任何grep Mac 用于其终端的风格过滤它们。如果要查找所有以文本结尾的文件,可以使用正则表达式 .txt$(这意味着以 '.txt' 结尾)

ls | egrep -e "yourRegexExpression" 

之后你会得到一个输入流,但cp 不适用于输入流并且只接受一堆参数,这就是我们使用 xargs 将其转换为参数的原因。最后一步是在参数中添加标志-t,以表示下一个参数是目标目录。

ls | egrep -e "yourRegexExpression" | xargs cp -t DIRECTORY

我希望这会有所帮助!

编辑

抱歉,我没有很好地阅读问题,我已更新以匹配您的问题。在这里你可以看到egrep 命令以(filename1|filename2|...|fileN) 这种方式编译了一个包含所有文件名的相当大的正则表达式字符串。 $() 计算内部命令并使用tr 将newLines 转换为“|”对于正则表达式。

ls | egrep -e "("$(cat yourtextfile.txt | tr "\n" "|")")" | xargs cp -t DIRECTORY

【讨论】:

    【解决方案2】:

    你可以这样做:

    $ for i in `cat example.txt`
    find /search/path -type f -name "$i" -exec cp "{}" /new/path \;
    

    这是它的工作原理,对于example.txt 中的每一行:

    for i in `cat example.txt`
    

    它将尝试在定义的路径中找到与$i 行匹配的文件:

    find /search/path -type f -name "$i"
    

    如果找到它会将其复制到所需的位置:

    -exec cp "{}" /new/path \;
    

    【讨论】:

    • 嘿,nbari,我几乎让它工作了,但是当它读取文件名时,它会分解它们,因为它们有空格。 txt 文件中的文件名例如:20130902 221149 529 000000 0930 0570.bmp。因此,当我回显时,读取的名称我得到 20130902 作为一个文件名,221149 作为下一个文件名,依此类推。我尝试使用正则表达式,以便终端知道要读取什么作为文件名,但我没有让它运行。这就是我目前所拥有的: for i in $(cat /path/file.txt) | grep '^2013[0-9]+bmp' ;回声 $i;完毕。你介意看看吗?我对正则表达式非常陌生。谢谢
    • @MoritzSchmid 我更新了答案,查看{}周围的引号
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多