검색하는 데 사용하고 있습니다 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 find
4.9 이상을 사용하면 locate
이름이 ase로 시작하는 모든 파일이 나열되고,b
gcc
find
일반 파일심볼릭 링크가 해결된 후.
또는 glob과 동일합니다 zsh
.
print -rC1 ${(0)^"$(locate -b0 'gcc*')"}(N-.)
-f
Perl은 연산자 [
/를 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
.