使用 find 命令的输出来删除特定目录

使用 find 命令的输出来删除特定目录

当我运行此查找命令时:

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 循环中读取该文件以删除缩略图目录。

相关内容