Bash - 在许多目录

时间:2015-09-21 07:38:42

标签: bash

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

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

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

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

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

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

例如:found: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)" 

1 个答案:

答案 0 :(得分:0)

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

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

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

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)