【问题标题】:Bash - find recursively in many directoriesBash - 在许多目录中递归查找
【发布时间】:2015-09-21 07:38:41
【问题描述】:

我有 2 个或更多目录路径存储在一个变量中 - 查找命令的输出:

folders="$(find /g -type d -name "jpgtest*")" 

注意:目录名称可能有空格。

假设有 2 个目录: g/jpgtest1 , g/jpgtest2。

如何在这两个子目录的所有子目录中搜索“*.A”形式的所有文件,

然后删除所有格式为“*.B”的文件,其中 * 表示:名称以与扩展名为 A 的文件相同的名称开头。

例如:找到:g/jpgtest1/test1/j.A

删除: g/jpgtest1/test1/j1.B ,但不要删除 g/jpgtest1/test1/f1.B

2 个目录以此类推。

一个可能的解决方案:

shopt -s globstar nullglob
for f in $folders/**/*.A ; do
   rm -f "${f%.A}"*.B
done

但它仅适用于“文件夹”中的一个目录,我应该更改什么以便它也适用于多个目录。

编辑:

任何解决方案当它在 bash 脚本中并且“文件夹”的内容未知时,例如,由于查找超过一个月的文件夹:

  folders="$(find /g -maxdepth 1 -type d -atime +30)" 

【问题讨论】:

    标签: bash


    【解决方案1】:

    您的问题如下:假设您找到jpgtest1jpgtest2。然后表达式$folders/**/*.A 产生:

    /g/jpgtest1 /g/jpgtest2/**/*.A
    

    然后使用 glob 扩展,仅在 jpgtest2 下找到 *.A 文件。试试这个:

    for f in /g/**/jpgtest*/**/*.A ; do
    

    如果您打算使用find 的输出作为输入,您可以使用双重for,原因如下:

    for folder in $folders; do
       for f in $folder/**/*.A ; do
          rm -f "${f%.A}"*.B
       done
    done
    

    唯一的缺点是,如果任何文件夹中有空格,它就会中断。解决方案是逐行读取(或使用IFS,但我显示的是逐行解决方案):

    while read folder; do
       for f in "$folder"/**/*.A ; do
          rm -f "${f%.A}"*.B
       done
    done < <(find /g -maxdepth 1 -type d -atime +30)
    

    【讨论】:

    • 为了更接近 OP 的 find 命令,它将是 /g/**/jpgtest*/**/*.A
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多