以下のスクリプトには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 {} +