当我运行此查找命令时:
find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4
我得到这样的输出:
/html/car_images/inventory/16031/16031_06.jpg
/html/car_images/inventory/16117/16117_01.jpg
/html/car_images/inventory/16126/16126_01.jpg
/html/car_images/inventory/16115/16115_01.jpg
/html/car_images/inventory/16128/16128_02.jpg
/html/car_images/inventory/16128/16128_03.jpg
/html/car_images/inventory/16128/16128_04.jpg
我的目标是删除每个目录中存在的“缩略图”文件夹(即删除此文件夹: /html/car_images/inventory/16128/thumbnails/ 并且还删除/html/car_images/inventory/16115/缩略图/
我正在考虑一个脚本,它获取上面 find 命令的每一行输出,然后替换“*.jpg”与“缩略图”并添加作为前缀“rm -fr”,这样我最终会得到以下结果:
rm -fr /var/www/html/car_images/inventory/16115/thumbnails/
rm -fr /var/www/html/car_images/inventory/16128/thumbnails/
等等...
关于如何做到这一点有什么想法吗? (也许使用 find 和 sed 或 cut 的 -exec 选项?)
(表达我整个目标的另一种方式是,如果一个文件夹包含一个比 X 天“年轻”的 .jpg 文件,则删除其文件夹中的“thumbnails”文件夹)
答案1
假设您的文件名没有换行符:
find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4 \
-exec sh -c 'echo "${1%/*}"' _ {} \; | sort -u | \
xargs -d $'\n' -I{} rm -r {}/thumbnails
参数扩展,
${1%/*}
从每个找到的条目中提取没有文件名的部分sort -u
排序,然后使条目唯一,这样我们就不会出现任何重复的条目xargs -I{} rm -r {}/thumbnails
添加thumbnails
到最后,然后删除生成的目录
答案2
while read dir;
do
rm -r "$dir"/thumbnails;
done < <(while read file; do dirname "$file"; done < <(find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4) | sort -u)
这是使用进程替换内的进程替换来完成的。
它根据 OP 标准查找文件,在 while 循环中获取每个 jpg 文件的目录名,排序并删除重复项(受 @heemayl 启发),然后在 while 循环中读取该文件以删除缩略图目录。