실수로 디렉터리의 폴더를 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 {} \;
{}
이 메소드는 수정 없이 독립형 매개변수 로 사용됩니다 ../
. 우리는 값을 {}
쉘에 전달하고 쉘은 이를 적용합니다 ../
.
노트:
-maxdepth 1
위치 옵션(예: )보다 먼저 전역 옵션(예: )을 정의하는 것이 권장되기-type d
때문에 반대 순서입니다 .man find
-maxdepth
-type
셸 명령은 작은따옴표( )로 묶어야 합니다
'rm -r "../$1"'
. 큰따옴표로 묶인 경우 원래 쉘은 해당 값을 대체$1
하고 발견된 디렉토리 이름은find
무시됩니다.sh
우리를 대신할 부름받은 사람들이 필요합니다 . 토큰화 및 경로 이름 확장으로부터"../$1"
디렉터리 이름을 보호하기 위해 문자열은 큰따옴표로 묶입니다.$1
쉘은 문자열을
Rm
에 할당합니다$0
. 오류 메시지가 나타나지 않는 한 이 옵션은 사용되지 않습니다. 따라서 어떤 문자열이라도 사용할 수 있습니다.
답변2
그리고 zsh
:
cd /home/michal &&
rm -rf -- Music/*(/D:t)
glob 한정자는 숨겨진 디렉터리를 포함한 /
디렉터리만 선택하는 반면, 기록 확장의 수정자는 디렉터리만 선택합니다.D
:t
꼬리(디렉토리 부분이 없는 파일 이름).
Bourne과 유사한 쉘의 경우:
cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"
그러나 위와 한 가지 차이점은 디렉터리에 대한 심볼릭 링크도 포함한다는 것입니다(그리고 링크 자체가 아닌 대상의 내용을 삭제합니다).