如何以交互方式删除符合给定条件的所有目录?

如何以交互方式删除符合给定条件的所有目录?

我的下面的脚本有两个问题:

  • 脚本在第一个匹配的目录后停止
  • rm -i不太互动

我的哪些错误假设导致它失败?我该如何修复它?

ls -1A | xargs -d "\n" \
sh -c '(find "$1" -mindepth 1 -maxdepth 1 \
    -name "*.flac" | read 2>/dev/null) || rm -ri "$1"'

答案1

rm的标准输入(从中读取提示答案)是/dev/null(由 GNU xargs 设置,其他一些 xargs 实现会将其保留为来自 ls 的管道)。

sh一次收到许多参数,但您只处理一个 ( $1)。

另请注意,换行符与文件名中的任何字符一样有效,这就是为什么您通常无法ls可靠地处理输出的原因。

zsh

for dir (*(ND/)) {
  flacs=($dir/*.flac(ND.))
  (($#flacs)) || rm -ri -- $dir
}

否则,你可以这样做:

find . ! -name . -prune -type d -exec sh -c '
  for dir do
    find "$dir/." ! -name . -prune -type f -name "*.flac" | read f ||
      rm -ri "$dir"
  done' sh {} +

相关内容