이 질문을 바탕으로,
"찾기" 출력을 기반으로 디렉터리를 삭제하는 방법은 무엇입니까?
결과의 첫 번째 폴더만 삭제해 보았습니다.
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])
이렇게 하면 확장된 첫 번째 디렉터리가 삭제됩니다 *
. 와일드카드 한정자는 (D/[1])
일치 항목을 *
디렉터리( /
)로만 제한하지만 숨겨진 이름( D
)을 포함하고 첫 번째로 일치하는 이름( [1]
)만 반환합니다. 현재 디렉터리에 디렉터리가 없으면 셸에서 "일치 항목을 찾을 수 없습니다"라는 오류 메시지가 표시됩니다.
답변3
위험해 보이지만 다음을 시도해 볼 수 있습니다.
find * -type d | head -n1 | xargs rm -rf
답변4
나에게 이 코드는 작동합니다:
- -type f인 파일만 찾기,
- ".gz"를 포함하지 않는 파일 필터링
- 이 예에서 N개의 파일을 선택하려면 첫 번째 파일만 선택합니다. -n 1
암호:
찾다. -f를 입력하세요! -name "*.gz" | xargs rm -rf {};