찾기 명령: 파일 경로 및 -name 매개변수

찾기 명령: 파일 경로 및 -name 매개변수

현재 디렉터리의 일부 파일을 처리하는 스크립트를 작성 중입니다. 첫 번째 예에서는 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등의 다른 옵션 사용 ). 그러나 그 반대는 불가능합니다.maxdepthprune

고려하다:

$ 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
$

나는 다음과 같은 이유로 두 번째 접근 방식을 선호합니다.

  1. 더 유연합니다.
  2. 오류가 발생하기 쉽습니다. 일치하는 항목이 없을 때 와일드카드를 사용하면 문제가 발생할 수 있습니다. 가능하다면, 특히 find그러한 도구가 있다면 와일드카드의 쉘 확장을 피할 것입니다.

또 다른 관련 없는 사항이 있습니다. 건너뛰세요 xargs.

find ... -exec ls -lrth {} +

관련 정보