이름이 마스크와 일치하는 파일 또는 파일에 대한 심볼릭 링크 찾기

이름이 마스크와 일치하는 파일 또는 파일에 대한 심볼릭 링크 찾기

검색하는 데 사용하고 있습니다 sudo find / -name gcc*. 여러 디렉토리를 반환하지만 저는 파일만 원합니다. 하지만 추가하면 -type f내가 원하는 심볼릭 링크가 나열되지 않습니다. 디렉토리를 필터링하고 심볼릭 링크를 유지하는 방법은 무엇입니까?

또한 와일드카드를 사용해 도 지원되지 않는 와일드카드 *라는 파일을 나열할 수 없다는 사실을 발견했습니다 gcc-10. find이 작업을 수행할 수 있는 다른 유틸리티가 있습니까?

답변1

GNU 구현을 통해 다음을 find사용할 수 있습니다.

find / -name 'gcc*' -xtype f

type심볼릭 링크 확인 후 파일을 확인하는 데 사용됩니다.

재귀 글로브를 사용하면 zsh다음과 같은 효과를 얻을 수 있습니다.

print -rC1 /**/gcc*(-.)

여기서 glob 한정자는 기호 링크 확인 후에 -다음 한정자(여기서는 동일 )가 적용되도록 합니다 ..-type f

가능하다면 이미 구축된 데이터베이스에서 파일을 찾기 때문에 일반적으로 더 빠른 방법을 대신 find사용할 수도 있습니다 .locate

locate -b0 'gcc*' | find -files0-from - -prune -xtype f

GNU find4.9 이상을 사용하면 locate이름이 ase로 시작하는 모든 파일이 나열되고,bgccfind일반 파일심볼릭 링크가 해결된 후.

또는 glob과 동일합니다 zsh.

print -rC1 ${(0)^"$(locate -b0 'gcc*')"}(N-.)

-fPerl은 연산자 [/를 test테스트할 수 있기 때문에 이에 대해서도 유용합니다.정기적인기본적으로 심볼릭 링크는 파일로 확인되므로 다음을 수행할 수 있습니다.

locate -b0 'gcc*' | perl -l -0ne 'print if -f'

이렇게 하면 전체 파일 시스템을 크롤링할 필요 없이 거의 즉시 결과를 얻을 수 있습니다(단, locate마지막 데이터베이스 업데이트 이후 추가된 일부 파일은 손실될 수 있음).

답변2

에서 man find:

-type c
   File is of type c:
   [...]
   f      regular file
   [...]
   l      symbolic  link;  this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken.  If you want to search for symbolic links
          when -L is in effect, use -xtype.

find심볼릭 링크와 파일을 표시 하려면 매개 변수를 사용하십시오 -type f,l.

와일드카드 관련: find와일드카드가 실제로 지원됩니다. 그러나 ( -name gcc*대신 ) 표현식을 인용하지 않았기 때문에 -name 'gcc*'쉘은 실행하기 전에 gcc*이 와일드카드 표현식과 일치하는 현재 작업 디렉토리의 모든 파일로 확장됩니다 find. (두 개 이상의 파일과 일치하는 경우 find: paths must precede expression호출 시 오류가 발생하며 이는 에서도 설명됩니다 man.)

따라서 현재 작업 디렉토리에 이름이 지정된 파일이 있으면 gcc-xyz쉘이 실행됩니다 find -name gcc-xyz.

관련 정보