
이 질문을 바탕으로,
`find` 출력을 기반으로 디렉토리를 삭제하는 방법은 무엇입니까?
다음을 수행하여 결과의 첫 번째 폴더만 제거하려고 했습니다.
find * -type d | head -n1 | -exec rm -rf {} \;
하지만 다음 오류가 발생합니다.
bash: -exec: command not found
뭐가 문제 야?
답변1
또는 다음 -quit
을 사용한 후 사용할 수 있습니다 .-delete
-exec
-그만두다
즉시 종료하십시오. 실행 중인 하위 프로세스는 없지만 명령줄에 지정된 경로는 더 이상 처리되지 않습니다.
명령 의 첫 번째 결과 삭제 find
:
find * -type d -exec rm -Rf {} \; -quit
또는
find . ! -path . -type d -exec rm -Rf {} \; -quit
후자는 숨겨진 폴더를 찾습니다.
찾기 출력은 다음과 같습니다.알파벳순으로 정렬되지 않음.
정렬 후 첫 번째 결과를 삭제하려면 다음을 수행하세요.
find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf
숫자 정렬의 경우 를 사용합니다 sort -zn
.
답변2
pLumo는 몇 가지 좋은 대체 솔루션을 적절하게 제공했습니다.그들의 대답에. 나는 완전히 다른 접근 방식을 제공하고 있습니다.
최상위 검색 경로를 설명하는 find
데 사용하는 방식인 이 명령은 실제로 다음 용도로만 사용된다는 점을 알 수 있습니다.*
*
다음으로 확장되는 이름 중에서 첫 번째 디렉토리를 찾습니다..
쉘 루프를 사용하여 이 작업을 수행할 수도 있습니다. 그러면 코드를 더 쉽게 읽고 그 내용을 확인할 수 있습니다.
shopt -s dotglob nullglob
for name in *; do
if [ -d "$name" ] && [ ! -h "$name" ]; then
rm -rf -- "$name"
break
fi
done
쉘 에서 실행된다고 가정하는 이 루프는 bash
일치하는 모든 이름 *
(숨겨진 이름 포함)을 반복합니다. 루프의 본문은 현재 이름이 디렉토리인지(디렉토리에 대한 심볼릭 링크가 아닌) 테스트하고, 그렇다면 루프를 종료하기 전에 디렉토리를 재귀적으로 삭제합니다.
zsh
훨씬 간단한 명령을 사용하여 셸 에서 비슷한 효과를 얻을 수 있습니다.
rm -rf -- *(D/[1])
*
그러면 확장되는 첫 번째 디렉터리가 제거됩니다 . globbing 한정자는 (D/[1])
일치 항목을 *
디렉터리( )로만 제한 /
하지만 숨겨진 이름( D
)을 포함하고 첫 번째로 일치하는 이름( [1]
)만 반환합니다. 현재 디렉터리에 디렉터리가 없으면 셸에서 "일치하는 항목을 찾을 수 없습니다"라는 오류 메시지가 표시됩니다.
답변3
이는 매우 위험해 보이지만 다음과 같이 시도해 볼 수 있습니다.
find * -type d | head -n1 | xargs rm -rf
답변4
나를 위해 다음 코드를 사용했습니다.
- -type f를 가진 파일만 찾습니다.
- ".gz"를 포함하지 않는 파일 필터링
- 이 경우 N개의 파일을 선택하세요. FIRST ONE -n 1
암호:
찾다 . -f를 입력하세요! -이름 "*.gz" | 헤드 -n 1 | xargs rm -rf {} ;