재귀적 "ls"를 사용하여 특정 디렉터리 제외

재귀적 "ls"를 사용하여 특정 디렉터리 제외

나는 다음 명령을 사용하여 특정 디렉터리에서 가장 최근에 업데이트된 파일을 (재귀적으로) 나열하고 수정 시간별로 정렬했습니다.

$ stat --printf="%y %n\n" $(ls -tr $(find * -type f))

그러나 계층 구조에는 거의 매분 업데이트되는 파일로 가득 찬 디렉터리가 하나 있으므로 해당 디렉터리 외부의 파일을 찾는 데 위 명령이 거의 쓸모가 없게 됩니다.

플래그 를 사용해 보았 ls -I으나 아무 소용이 없었습니다.

$ stat --printf="%y %n\n" $(ls -trI 'bad-dir' $(find * -type f))

명령을 사용하여 개별/특정 디렉터리를 제외하는 쉬운 방법이 있습니까 ls? 아니면 find명령 에 검색을 넣어야 하나요 ?

답변1

추가로 필요하지 않습니다 ls -tr. 이는 귀하의 명령과 동일하며 더 빠릅니다.

find . -type f | xargs stat --printf="%y %n\n" | sort -n

다음과 같은 것은 파일의 하위 디렉터리를 제외합니다.

find . -type f ! -path './directory/to/ignore/*' \
     | xargs stat --printf="%y %n\n" \
     | sort -n

전체 하위 디렉터리를 무시하고 여전히 모든 파일을 검사하려면 를 사용하세요 -prune. 먼저 모든 파일을 찾지 않도록 순서를 조금 변경해야 합니다.

find . -path './directory/to/ignore' -prune -o -type f -print0 \
     | xargs -0 stat --printf="%y %n\n" \
     | sort -n

가능한 한 효율적이기 위해 statfind가 이미 파일에 액세스하고 있다는 점을 고려하면 이는 중복됩니다. 따라서 해당 방법을 사용하면 실제로 파일 시스템에 2배 더 많은 손상을 입히게 되므로 이 모든 작업을 수행 find ... | stat ...하는 보다 효율적인 방법이 있습니다 .find

find . -path './directory/to/ignore' -prune -o -printf '%t %p\n' 
     | sort -n

이 버전을 작동시키려면 printf 명령을 조정하고 다양한 파일 시스템 메타데이터 stat에 대해 find다른 명령을 사용해야 했습니다.

인용하다

답변2

그리고 zsh:

stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)

관련 정보