我的下面的脚本有两个问题:
- 脚本在第一个匹配的目录后停止
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 {} +