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

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

이 질문을 바탕으로,

"찾기" 출력을 기반으로 디렉터리를 삭제하는 방법은 무엇입니까?

결과의 첫 번째 폴더만 삭제해 보았습니다.

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

관련 정보