`find` 출력을 기반으로 디렉터리를 삭제하는 방법: 첫 번째 결과만

`find` 출력을 기반으로 디렉터리를 삭제하는 방법: 첫 번째 결과만

이 질문을 바탕으로,

`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 {} ;

관련 정보