我有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)"
答案 0 :(得分:0)
您的问题如下:假设您找到jpgtest1
和jpgtest2
。然后表达式$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)