주어진 기준과 일치하는 모든 디렉토리를 대화식으로 삭제하는 방법은 무엇입니까?

주어진 기준과 일치하는 모든 디렉토리를 대화식으로 삭제하는 방법은 무엇입니까?

아래 스크립트에는 두 가지 문제가 있습니다.

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

관련 정보