다음과 같은 레이아웃의 파일이 있다고 가정해 보겠습니다.
$ 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에 의해 생성된 파일 이름 목록(해당 파일의 내용이 아닌)을 처리하려면 다음을 수행할 수 있습니다.
process_the_files
위의 내용을 그대로 사용하고 해당 파일의 내용이 아닌 파일 이름 매개변수를 반복하도록 스크립트를 작성하십시오 .process_the_files
파일 이름 목록이 너무 커서 하나의 명령줄에 들어갈 수 없는 경우 xargs를 여러 번 실행할 수 있습니다(이는 운영 체제에 따라 다르며 Linux에서는 약 2MB입니다) .그런데,
find ... -exec ... {} +
같은 방식으로 시스템 명령줄 길이에 의해 제한됩니다.파이프의 해당 부분을 건너뛰고
xargs
정렬된 출력을 원하는 작업으로 파이프하세요.~ 해야 하다NUL로 구분된 입력을 처리할 수 있습니다(대부분의 GNU 도구는 가능하며 awk 또는 perl로 직접 작성하기 쉽습니다. sh - sh 변수도 NUL을 포함할 수 없지만 NUL을 단지 NUL을 사용하는 경우에는 중요하지 않습니다. 구분자) . 그렇게 하는 것은 명령줄 길이에 의해 제한되지 않습니다. 표준 입력에서 오는 파일 이름 수에 관계없이 처리할 수 있습니다.