현재 디렉터리의 일부 파일을 처리하는 스크립트를 작성 중입니다. 첫 번째 예에서는 find 명령을 사용하고 디렉터리를 인수로 전달합니다. 두 번째에서는 find 명령에 -name 스위치를 사용하여 원하는 파일 이름을 전달했습니다. 하지만 누군가 아래 두 가지의 차이점을 나에게 설명해 줄 수 있습니까? 왜냐하면 그들은 정확히 동일한 출력을 생성하기 때문입니다.
find dump* -type f -mtime +5 | xargs ls -ltrh
find $dir -type f -name "dump*" -mtime +5 | xargs ls -ltrh
위의 예에서는 파일이 포함된 디렉터리에서 실행 중이라고 가정하세요. 그러나 두 번째 경우에는 어디에서나 실행할 수 있습니다. 내 주요 관심사는 파일 경로와 이름 부분이므로 가능하다면 그것에 집중하세요.
이 질문이 이전에 요청되었다면 죄송합니다. 찾아보았지만 아무것도 찾을 수 없었습니다.
감사해요.
답변1
첫 번째 경우에는 dump*
셸에 의해 해석되고 파일 이름과 일치하도록 확장된 다음 에 전달 됩니다 find
.find
find dumpa dumpb ... -type f ...
두 번째 경우에는 쉘이 해석을 수행하지 않습니다. find
필터링합니다. 따라서 의 재귀적 특성을 고려하면 find
두 번째 방법은 첫 번째 방법에서 놓친 파일을 찾을 수 있습니다.
-name
두 번째 접근 방식은 변수를 사용하여 구성 / 필터링 할 수 있으므로 더 유연 -path
하지만 얻기가 더 어렵습니다.쉘 확장 와일드카드변수에서. 사용 사례에 따라 그 중 하나는 정확하지만 모든 경우에 두 번째는 첫 번째와 일치하도록 수정될 수 있습니다( , 또는 find
등의 다른 옵션 사용 ). 그러나 그 반대는 불가능합니다.maxdepth
prune
고려하다:
$ tree .
.
├── dumpa
│ └── dumpc
├── dumpb
├── dumpd
└── not-dump
└── dumpe
$ find . -type f -name 'dump*'
./not-dump/dumpe
./dumpd
./dumpa/dumpc
$ find dump* -type f
dumpa/dumpc
dumpd
또한 첫 번째는 와일드카드와 일치하는 항목이 없으면 오류가 발생하지만 두 번째는 결과 없이 성공합니다.
$ find blahblah* -type f
find: `blahblah*': No such file or directory
$ find . -name 'blahblah*' -type f
$
나는 다음과 같은 이유로 두 번째 접근 방식을 선호합니다.
- 더 유연합니다.
- 오류가 발생하기 쉽습니다. 일치하는 항목이 없을 때 와일드카드를 사용하면 문제가 발생할 수 있습니다. 가능하다면, 특히
find
그러한 도구가 있다면 와일드카드의 쉘 확장을 피할 것입니다.
또 다른 관련 없는 사항이 있습니다. 건너뛰세요 xargs
.
find ... -exec ls -lrth {} +