find 명령 문제 - 기본 디렉토리를 나열하지 않고 디렉토리 아래의 하위 디렉토리와 파일을 나열하는 방법

find 명령 문제 - 기본 디렉토리를 나열하지 않고 디렉토리 아래의 하위 디렉토리와 파일을 나열하는 방법

찾기 명령 - 인수로 전달된 기본 디렉터리를 나열하지 않고 디렉터리 아래의 하위 디렉터리와 파일만 나열하는 방법입니다.

예:

find /abc/def/ghi -mtime +10 

위의 명령 출력 결과에는 기본 디렉터리가 그 안에 있는 하위 디렉터리 및 파일과 함께 나열됩니다.

/abc/def/ghi 
/abc/def/ghi/fff
/abc/def/ghi/abc.txt

출력이 아래와 같기를 원합니다.

/abc/def/ghi/fff
/abc/def/ghi/abc.txt

이 문제의 원인은 find명령 출력이 디렉터리와 파일을 반복적으로 삭제하는 데 사용되기 때문입니다. 따라서 기본 디렉터리가 /abc/def/ghi10일 동안 사용되지 않으면 해당 디렉터리도 나열되고 결국 삭제됩니다.

find /abc/def/ghi -mtime +10 -exec rm -rf {} \;

답변1

임계값보다 오래된 파일을 찾아 빈 디렉터리를 삭제합니다.

$base변수는 4번(문당 2번) 사용됩니다. 이 작업을 통해 우리는 자체 -path "$base/*"삭제를 방지할 수 있습니다 . 즉 , 최상위 또는 .$base*...

base=/abc/def
find "$base/" -path "$base/*" -type f -mtime +10 -exec rm -f {} +
find "$base/" -depth -path "$base/*" -type d -exec rmdir {} + 2>/dev/null

답변2

find두 가지 방법으로 최상위 검색 경로를 명시적으로 무시하도록 요청할 수 있습니다 .

  1. -path최상위 검색 경로에서 작업하지 않으려면 표준 테스트를 사용하세요 .

    find /abc/def/ghi ! -path /abc/def/ghi ...other tests/actions...
    

    그러면 최상위 검색 경로가 발견되지만 -path테스트에 사용된 경로 이름과 정확히 일치하므로 해당 경로에 대한 작업은 피하십시오. 이는 ! 테스트 목적에 어긋납니다.

  2. 비표준이지만 일반적으로 구현되는 -mindepth테스트를 사용하십시오.

    find /abc/def/ghi -mindepth 1 ...other tests/actions...
    

    이로 인해 find"깊이 0"에 있는 모든 경로 이름, 즉 최상위 검색 경로 자체가 무시됩니다.

  3. 실제로 수행하려는 작업에 따른 세 번째 접근 방식은 디렉터리에 관심을 두지 않는 것입니다(최상위 검색 경로는 일반적으로 디렉터리 경로이므로).

    find /abc/def/ghi ! -type d ...other tests/actions...
    

이제 수행하려는 작업을 살펴보면 지난 10일 동안 새 콘텐츠가 추가되거나 제거되지 않은 디렉터리를 정리하려는 것 같습니다. 가장 안전한 방법은 직접 보는 것입니다.문서특히 오래된 파일을 삭제하십시오. 이 작업을 완료하면 결국 비어 있는 디렉터리를 삭제할 수 있습니다.

디렉토리의 타임스탬프에 의존하고 싶지 않은 이유는 해당 타임스탬프가 파일이 언제 들어왔는지 알려주지 않기 때문입니다. 하위 디렉토리추가되거나 제거될 수 있습니다. 오래된 타임스탬프 때문에 디렉터리를 삭제하면 하위 디렉터리의 새 파일이 실수로 삭제될 수 있습니다.

나는 다음과 같은 것을 사용할 수 있습니다

find /abc/def/ghi -type f -mtime +10 -delete
find /abc/def/ghi ! -path /abc/def/ghi -type d -empty -delete

! -path /abc/def/ghi비어 있는 경우 삭제에 동의하면 최상위 검색 경로를 삭제할 수 있습니다.

-empty테스트와 -delete작업은 비표준이므로 표준을 사용하여 동일한 작업을 수행하는 방법은 다음과 같습니다 find.

find /abc/def/ghi -type f -mtime +10 -exec rm -f {} +
find /abc/def/ghi -depth ! -path /abc/def/ghi -type d -exec rmdir {} \; 2>/dev/null

첫 번째 명령은 간단해야 합니다. 오래된 파일을 수집하고 rm -f일괄적으로 불러옵니다.

두 번째 명령은 -depth깊이 우선 검색을 수행하는 데 사용됩니다. 우리가 이걸 하는 이유는

  1. find방금 삭제한 디렉토리에 들어가고 싶지 않습니다 .
  2. 디렉토리는 다음을 수행할 수 있습니다.~이 되다그 안의 다른 디렉토리를 삭제하면 비어 있었습니다.

두 번째 명령도 rmdir실행을 시도합니다.모두디렉터리(최상위 검색 경로 제외) 이것은 것이다실패하다비어 있지 않은 디렉터리의 경우 오류 스트림을 리디렉션하여 /dev/null진단 메시지를 무시합니다.

완전히 비어 있는 디렉토리 만 호출하려면 rmdir다음을 사용할 수 있습니다.

find /abc/def/ghi -depth ! -path /abc/def/ghi -type d \
    -exec bash -O dotglob -O nullglob -c '
    for dirpath do
        set -- "$dirpath"/*
        [ "$#" -gt 0 ] && rmdir "$dirpath"
    done' bash {} +

bash이는 디렉터리를 반복하고 각 디렉터리에 대해 *그 안의 와일드카드 패턴을 확장하려고 시도하는 짧은 인라인 스크립트를 호출합니다 . 이름이 전혀 없는 상태로 확장되면 디렉터리가 삭제됩니다.

답변3

신경쓰지 마세요.. 거의 시행착오 없이 답을 스스로 알아냈습니다.

find /abc/def/ghi/* -mtime +10 -exec rm -rf {} \;

관련 정보