find 명령: 경로에서 {} 사용

find 명령: 경로에서 {} 사용

실수로 내 디렉터리의 폴더를 Music상위 michal디렉터리로 복사했습니다. 이 디렉토리를 한꺼번에 삭제하고 싶습니다.

다음 작업을 수행할 수 있는 방법이 있습니까? 아니면 더 나은 대안이 있습니까?

/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;

분명히 {}위의 반환 때문에 대체되지 않습니다.

rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...

답변1

귀하의 find명령은 GNU에서 잘 작동합니다 find. 시스템에서 작동하지 않으면 다음을 시도해 보세요.

find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;

이 접근 방식 {}은 에 의해 수정되지 않고 독립적인 인수로 사용됩니다 ../. 우리는 의 값을 {}쉘에 전달하고 쉘은 를 적용합니다 ../.

노트:

  1. 와 같은 전역 옵션을 과 같은 위치 옵션보다 먼저 정의하도록 권장하므로 -maxdepth 1및 의 순서 -type d가 바뀌었습니다 .man find-maxdepth-type

  2. 쉘 명령은 작은따옴표로 묶어야 합니다: 'rm -r "../$1"'. 큰따옴표로 묶인 경우 원래 쉘은 해당 값을 대체 $1하고 에서 찾은 디렉토리 이름은 find무시됩니다. sh대체를 수행하려면 호출이 필요합니다 . 문자열은 단어 분할 및 경로 이름 확장으로부터 "../$1"디렉토리 이름 을 보호하기 위해 큰따옴표로 묶여 있습니다 .$1

  3. 쉘은 문자열을 Rm에 할당합니다 $0. 오류 메시지가 없으면 사용되지 않습니다. 결과적으로 모든 문자열을 사용할 수 있습니다.

답변2

와 함께 zsh:

cd /home/michal &&
rm -rf -- Music/*(/D:t)

glob /한정자는 디렉터리만 선택하고 D숨겨진 디렉터리도 포함하는 것이며, :t히스토리 확장과 같은 수정자는 디렉터리만 선택하는 것입니다.꼬리(디렉토리 부분이 없는 파일 이름)

Bourne과 같은 쉘을 사용하면:

cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"

위와 한 가지 차이점은 디렉토리에 대한 심볼릭 링크도 포함한다는 것입니다(그리고 링크 자체 대신 대상의 내용을 제거합니다).

관련 정보