"찾기" 결과를 알파벳순과 위상순으로 정렬하는 방법은 무엇입니까?

"찾기" 결과를 알파벳순과 위상순으로 정렬하는 방법은 무엇입니까?

다음과 같은 레이아웃의 파일이 있다고 가정해 보겠습니다.

$ tree
.
├── 01/
│   ├── example.txt
│   └── foobar.txt
├── 02/
│   └── example.txt
└── 03/
    ├── example.txt
    └── test.txt

3 directories, 5 files

find .디렉토리와 파일을 토폴로지 순서(즉, 디렉토리 이름이 내용 앞에 옴)와 동일한 디렉토리 내에서 알파벳 순서로 인쇄하고 싶습니다 . 대신에 제가 얻은 결과는 다음과 같습니다.

$ find .
.
./02
./02/example.txt
./01
./01/foobar.txt
./01/example.txt
./03
./03/test.txt
./03/example.txt

출력이 다음과 같기를 원합니다.

.
./01
./01/foobar.txt
./01/example.txt
./02
./02/example.txt
./03
./03/example.txt
./03/test.txt

명령이 완료되기 전에 줄을 하나씩 순서대로 처리 sort하고 싶기 때문에 다른 명령으로 파이프하고 싶지 않습니다 .find

답변1

당신은 그렇게 할 수 없습니다.

특정 순서로 파일을 처리하려면 처리를 시작하기 전에 해당 순서로 파일을 정렬해야 합니다.

find파일 시스템에서 어떤 순서로든 파일/디렉터리를 찾습니다(종종 "디렉터리 순서"라고 하며, 많은 파일 시스템의 경우 주로 생성 날짜에 영향을 받지만 파일/디렉터리가 삭제되면 해당 위치가 재사용될 수 있으므로 기본적으로 다음과 같이 가정해야 합니다). 무작위), 귀하의 경우에는 알파벳순이 아닌 것 같습니다. 그러나 알파벳순으로 먼저, 아마도 파일 시스템에서 마지막일 것입니다. 따라서 파일을 알파벳순으로 처리하려면 전체 디렉터리를 읽어야 합니다.

원하는 것과 가장 가까운 결과를 얻으려면 일부 코딩을 수행해야 할 수도 있습니다. 검색의 최상위 디렉터리를 검색하는 경우 "01" 디렉터리를 다음으로 검색한 다음 "02", ...를 검색하는 동시에 "02"(및 후속 디렉터리)를 검색하는 동안 "01" 처리를 시작할 수 있습니다. . (디렉토리 구조가 더 일반적인 경우 적절하게 일반화하십시오.)

답변2

GNU find, sort, 및 xargs:

find . -print0 | sort -z | xargs -0r process_the_files

process_the_files-exec찾기 옵션을 사용하여 실행할 프로그램이나 스크립트 입니다 .

이는 파이프라인(-print0, -z 및 -0 옵션) 전체에서 파일 이름 구분 기호로 NUL을 사용하므로 유효한 문자(공백, 탭, 줄 바꿈 등 포함)가 포함된 파일 이름을 사용하는 것이 안전합니다.

find에 의해 생성된 파일 이름 목록(해당 파일의 내용이 아닌)을 처리하려면 다음을 수행할 수 있습니다.

  1. process_the_files위의 내용을 그대로 사용하고 해당 파일의 내용이 아닌 파일 이름 매개변수를 반복하도록 스크립트를 작성하십시오 . process_the_files파일 이름 목록이 너무 커서 하나의 명령줄에 들어갈 수 없는 경우 xargs를 여러 번 실행할 수 있습니다(이는 운영 체제에 따라 다르며 Linux에서는 약 2MB입니다) .

    그런데, find ... -exec ... {} +같은 방식으로 시스템 명령줄 길이에 의해 제한됩니다.

  2. 파이프의 해당 부분을 건너뛰고 xargs정렬된 출력을 원하는 작업으로 파이프하세요.~ 해야 하다NUL로 구분된 입력을 처리할 수 있습니다(대부분의 GNU 도구는 가능하며 awk 또는 perl로 직접 작성하기 쉽습니다. sh - sh 변수도 NUL을 포함할 수 없지만 NUL을 단지 NUL을 사용하는 경우에는 중요하지 않습니다. 구분자) . 그렇게 하는 것은 명령줄 길이에 의해 제한되지 않습니다. 표준 입력에서 오는 파일 이름 수에 관계없이 처리할 수 있습니다.

관련 정보