【问题标题】:Copy all files in a directory with a particular string in the filename to different directory in Bash [closed]将文件名中具有特定字符串的目录中的所有文件复制到Bash中的不同目录[关闭]
【发布时间】:2012-12-31 12:25:07
【问题描述】:

例如,一个目录可以包含文件

12_foo9.dat
34foo32.txt
24foobar.png
997_bar.txt

我想将文件名中带有“foo”的文件复制到一个单独的目录中,这样它就可以包含前三个文件,但不包含第四个。

我环顾四周,但还没有想出办法做到这一点。该目录有非常多的文件,但我需要复制的只有 1% 左右。

谢谢

【问题讨论】:

    标签: file bash copy filenames directory


    【解决方案1】:
    $ mkdir NEWDIR
    
    $ touch foo_file file_foo file_foo_file
    
    $ ls
    NEWDIR      file_foo    file_foo_file   foo_file
    
    $ cp -v *foo NEWDIR/
    file_foo -> NEWDIR/file_foo
    
    $ cp -v foo* NEWDIR/
    foo_file -> NEWDIR/foo_file
    
    $ cp -v *foo* NEWDIR/
    file_foo -> NEWDIR/file_foo
    file_foo_file -> NEWDIR/file_foo_file
    foo_file -> NEWDIR/foo_file
    
    $ ls NEWDIR/
    file_foo    file_foo_file   foo_file
    

    【讨论】:

    • -v 有什么作用?
    • -v 是“详细”标志,导致它准确输出正在移动的文件
    【解决方案2】:

    如果您真的关心文件的数量(例如运行数百万),您可以使用:

    find . -type f -depth 1 -name "*foo*" -exec cp {} /otherdir \; -print
    

    这不使用 shell 扩展,因此您不会尝试运行带有一百万个参数的命令。 -print 为您提供一些进度指示,可以省略。简单列出要复制的文件:

    find . -type f -depth 1 -name "*foo*"
    

    【讨论】:

      【解决方案3】:

      使用globbing:

      shopt -s failglob
      echo cp *foo* /path/to/separate
      

      这将输出复制命令(或以bash: no match: *foo* 失败)。

      当您验证输出以实际复制目录条目时,删除echo

      【讨论】:

      • “回声”有什么好处?它没有说明将包含哪些文件。如果需要,您需要“ls foo”确认将匹配的文件,然后“cp foo /target”复制相同的文件。实际上,我想我会将这个建议添加到我的答案中......
      • @DreadPirateShawn:感谢您的评论。我已经更新了我的答案(使用 Bash v4.2.37 测试)。
      【解决方案4】:
      cp *foo* /path/to/separate_directory
      

      如果要验证将首先包含的文件,请使用:

      ls *foo*
      

      这将确认要匹配的文件,然后您可以使用 cp 命令重复使用相同的模式来执行复制。

      【讨论】:

        【解决方案5】:

        试试这个语句:cp *foo* /newdir

        【讨论】:

        • 谢谢,这么简单,不好意思问了这么明显的问题!
        • NP - 我不想急于争取代表,但随时接受这个答案:-)
        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        相关资源
        最近更新 更多