아래 스크립트에는 두 가지 문제가 있습니다.
- 첫 번째 일치하는 디렉터리 이후에 스크립트가 중지됩니다.
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 {} +