【问题标题】:grep filenames matching a pattern and move to desired foldergrep 匹配模式的文件名并移动到所需的文件夹
【发布时间】:2012-12-18 07:13:12
【问题描述】:

我有一个 .txt 文件中的模式列表。 [列表.txt]。对于list.txt中的每一行,我想在list.txt中以指定模式开头的位置查找所有文件,然后将这些文件移动到另一个位置。 考虑一个例子。

~/home/ana/folder_a 我有list.txt,看起来像这样...

list.txt

1abc
2def
3xyz

在这个位置,即/home/ana/folder_a/,有多个以 list.txt 中的模式开头的文件。因此,有 1abc_a.txt、1abc_c.txt、1abc_f.txt、2def_g.txt、3xyz_a.txt 等文件

所以我想要实现的是:

for i in cat list.txt; do 
  ls | grep '^$i' [thats the pattern] | 
  mv [files containing the pattern] to /home/ana/folder_b/

请注意,在其他位置,即 /home/ana/folder_b/ 我已经创建了针对每种模式的目录。

所以 /home/ana/folder_b/ 包含子目录,如 1abc/ 、 2def/ 、 3xyz/ 实际上,我希望将匹配模式 '1abc'、'2def' 和 '3xyz' 的所有文件从 /home/ana/folder_a/ 移动到 /home/ana/folder_b/ 中它们各自的子目录中,这样 /home /ana/folder_b/1abc 将有 1abc_a.txt 、 1abc_c.txt 和 1abc_f.txt ; /home/ana/folder_b/2def/ 将有 2def_g.txt 和 /home/ana/folder_b/3xyz/ 将有 3xyz_a.txt

【问题讨论】:

    标签: linux bash shell grep move


    【解决方案1】:

    Grep 的 -f 选项匹配文件中的模式,因此您不必遍历 shell 中文件中的每一行:

    $ ls                              # List all files in dir, some match, some don't
    1abc_a.txt 1abc_c.txt 1abc_f.txt  2def_g.txt 3xyz_a.txt file1 file2 list.txt
    
    $ cat list.txt                    # List patterns to match against 
    1abc
    2def
    3xyz
    
    $ ls | grep -f list.txt           # grep for files that only match pattern
    1abc_a.txt
    1abc_c.txt
    1abc_f.txt
    2def_g.txt
    3xyz_a.txt
    

    发送到xargs 进行移动:

    ls | grep -f list.txt | xargs -i -t mv {} ../folder_B
    mv 1abc_a.txt ../folderB 
    mv 1abc_c.txt ../folderB 
    mv 1abc_f.txt ../folderB 
    mv 2def_g.txt ../folderB 
    mv 3xyz_a.txt ../folderB 
    

    编辑:意识到我错过了问题的子目录部分,@Thor 的答案是最好的方法,但我认为你可能会从这个答案中找到一些用处。

    【讨论】:

      【解决方案2】:

      我认为全局扩展是这里的方法:

      while read pattern; do
        mv "${pattern}"* ../folder_b/"$pattern"
      done < list.txt
      

      mv 命令前面添加echo,当您对输出感到满意时将其删除。

      【讨论】:

        【解决方案3】:

        我建议使用find-exec 操作在您的循环中调用mv

        开始文件结构:(如您所见,我从 folder_a 和 folder_b 的父级调用它)

        $ find
        .
        ./folder_a
        ./folder_a/1abc_a.txt
        ./folder_a/1abc_c.txt
        ./folder_a/1abc_f.txt
        ./folder_a/2def_g.txt
        ./folder_a/3xyz_a.txt
        ./folder_b
        ./folder_b/1abc
        ./folder_b/2def
        ./folder_b/3xyz
        ./list.txt
        
        $ cat list.txt
        1abc
        2def
        3xyz
        

        命令:

        while read pattern
         do 
          find ./folder_a -type f -name "$pattern*" -exec mv "{}" "./folder_b/$pattern" \;
         done <list.txt
        

        替代命令(同样的,都在一行上):

        while read pattern; do find ./folder_a -type f -name "$pattern*" -exec mv "{}" "./folder_b/$pattern" \;; done <list.txt
        

        生成的文件结构:

        $ find
        .
        ./folder_a
        ./folder_b
        ./folder_b/1abc
        ./folder_b/1abc/1abc_a.txt
        ./folder_b/1abc/1abc_c.txt
        ./folder_b/1abc/1abc_f.txt
        ./folder_b/2def
        ./folder_b/2def/2def_g.txt
        ./folder_b/3xyz
        ./folder_b/3xyz/3xyz_a.txt
        ./list.txt
        

        【讨论】:

          猜你喜欢
          • 2014-04-26
          • 1970-01-01
          • 2012-12-31
          • 2016-11-06
          • 2017-09-16
          • 1970-01-01
          • 2021-05-02
          • 2018-07-20
          • 2013-02-23
          相关资源
          最近更新 更多