指定された基準に一致するすべてのディレクトリを対話的に削除する方法は?

指定された基準に一致するすべてのディレクトリを対話的に削除する方法は?

以下のスクリプトには2つの問題があります。

  • 最初の一致するディレクトリの後、スクリプトは停止します。
  • 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つだけを処理します($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 {} +

関連情報