실수로 내 디렉터리의 폴더를 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 -- "$@"
위와 한 가지 차이점은 디렉토리에 대한 심볼릭 링크도 포함한다는 것입니다(그리고 링크 자체 대신 대상의 내용을 제거합니다).