찾기 명령 - 인수로 전달된 기본 디렉터리를 나열하지 않고 디렉터리 아래의 하위 디렉터리와 파일만 나열하는 방법입니다.
예:
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/ghi
10일 동안 사용되지 않으면 해당 디렉터리도 나열되고 결국 삭제됩니다.
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
두 가지 방법으로 최상위 검색 경로를 명시적으로 무시하도록 요청할 수 있습니다 .
-path
최상위 검색 경로에서 작업하지 않으려면 표준 테스트를 사용하세요 .find /abc/def/ghi ! -path /abc/def/ghi ...other tests/actions...
그러면 최상위 검색 경로가 발견되지만
-path
테스트에 사용된 경로 이름과 정확히 일치하므로 해당 경로에 대한 작업은 피하십시오. 이는!
테스트 목적에 어긋납니다.비표준이지만 일반적으로 구현되는
-mindepth
테스트를 사용하십시오.find /abc/def/ghi -mindepth 1 ...other tests/actions...
이로 인해
find
"깊이 0"에 있는 모든 경로 이름, 즉 최상위 검색 경로 자체가 무시됩니다.실제로 수행하려는 작업에 따른 세 번째 접근 방식은 디렉터리에 관심을 두지 않는 것입니다(최상위 검색 경로는 일반적으로 디렉터리 경로이므로).
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
깊이 우선 검색을 수행하는 데 사용됩니다. 우리가 이걸 하는 이유는
find
방금 삭제한 디렉토리에 들어가고 싶지 않습니다 .- 디렉토리는 다음을 수행할 수 있습니다.~이 되다그 안의 다른 디렉토리를 삭제하면 비어 있었습니다.
두 번째 명령도 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 {} \;