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 -- "$@"

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

관련 정보