파일 이름 길이로 파일 찾기


10

파일 이름 길이로 모든 파일을 찾고 싶습니다.

예를 들어 나는 같은 길이 1의 파일을 찾으려면 a.go, b.go.

나는 넣었다 :

grep '.\{1\}' file

그러나 이것은 작동하지 않습니다. 파일 이름 길이로 파일을 찾는 데 어떤 명령을 사용할 수 있습니까?


a.go길이 4 a의 파일 이름입니다. 길이 1의 파일 이름입니다. 이것은 이름과 확장자가 분리되어 있고 암시 적이 .항상 파일 이름의 일부인 DOS가 아닌 Unix 입니다.
Peter Cordes

답변:


3

grep파일 내용에서 패턴을 찾습니다. 당신이보고 싶은 경우 이름 의 파일 (현재 디렉토리에서만 파일 이름 고려할 경우), 당신은 단지 쉘 글로브를 사용할 수 있습니다 :

echo ?.go

(그런데, 그것은 echo명령이 아니라 글로브를 평가하는 쉘입니다 .)

현재 디렉토리부터 시작하여 디렉토리를 재귀 적으로 찾으려면 사용할 도구는 find다음과 같습니다.

find . -name '?.go'

(쉘을 find호출 하기 전에 쉘이 글로브로 평가하지 않도록 패턴을 인용해야합니다 .)


1
또한 패턴 '? .go'와도 일치하는 디렉토리를 찾습니다.
slm

@slm, 디렉토리는 여러 유형의 파일 중 하나이며 OP는 자신이 따르는 파일 유형을 지정하지 않았습니다.
Stéphane Chazelas

8

파일 이름 만 찾으려면 다음 명령을 사용할 수 있습니다.

find -exec basename '{}' ';' | egrep '^.{100,}$'

find사용하여 basename파일 또는 디렉토리의 이름을 뽑은 다음 100 자 이상의 파일 이름 또는 디렉토리 이름을 찾으십시오. 정확한 길이의 파일 이름을 찾으려면 {100}대신을 사용하십시오 {100,}.

경로를 포함한 파일 이름을 찾으려면 다음을 수행하십시오.

find | egrep '/[^/]{100,}$'

find 명령을 실행 한 상대 경로를 포함한 파일 이름을 반환합니다.


3

우선, grep쓰루 검색 내용을 파일, 그것은 파일 이름을 검색하지 않습니다. 당신이 원하는 것을 위해 find. 파일 이름 길이를 설정하는 옵션이 없지만 원하는 것을 얻기 위해 출력을 구문 분석 할 수 있습니다. 다음 파일이 포함 된 디렉토리에서 실행하는 몇 가지 예는 다음과 같습니다.

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

이 디렉토리에서 파일을 검색하면 다음이 리턴됩니다.

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

따라서 길이가 X 인 파일을 찾으려면 경로를 제거하고 마지막 문자 뒤에 만 문자를 일치시켜야합니다 /.

 $ find . -type f | grep -P '/.{3}$'

sed명령은을 제거합니다 ./. -P플래그에 필요한 펄 호환 정규 표현식 활성화 {n}PCRE 일 및 인 $수단 "문자열의 끝과 일치"를.

당신은 또한 단순히 이것을 할 수 있습니다 :

find . -type f | grep -P '/...$'

길이가 15 인 파일 이름과 일치하는 15 개의 점을 입력하는 작은 숫자는 그리 효율적이지 않습니다.

마지막으로 확장자를 무시하고 파일 이름 만 일치 시키려면 다음을 수행하십시오 (@slm에서 제안한대로).

find . -type f | grep -P '/.{1}\.'

그러나 이것은 또한 같은 파일을 찾을 수 있습니다 a.bo.go. 파일 이름에 둘 이상이 포함될 수 있으면 더 좋습니다 ..

find . -type f | grep -P '/.{1}\.[^.]+$'

참고 : 위의 솔루션은 줄 바꿈 문자가 포함되어 있지 않은 상대적으로 정상적인 파일 이름을 가지고 있다고 가정합니다. 길이를 계산할 때 파일 이름의 공백을 무시하지 않는 것으로 간주합니다. 원하는 길이가 아닐 수도 있습니다. 이 중 하나라도 문제가 있으면 알려 주시면 답변을 업데이트하겠습니다.


1

지정하지는 않지만 파일이 디렉토리 구조 내에 있으면 find길이가 1 인 파일을 찾는 데 사용할 수 있습니다 grep.

$ find . -type f  | grep -P '/.{1}\.'

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

MacOS X에서 egrep을 사용하고 -P 옵션을 제거하십시오
Bart Kummel

@BartKummel-실제로 OSX에서 사용합니다 ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . 또한이 Q는 OSX로 태그가 지정되지 않았으므로 사용에 적합 grep합니다.
slm

1

나는 이것과 같은 것을 사용할 것입니다.

find . -type f -name "?.go"

두 개를 넣으면 "?" 그런 다음 두 글자와 확장자를 가진 파일 이름을 찾고 있습니다.


0

find 명령에서 정기적 인 exxpression을 사용하려면 다음 ""과 같이 사용해야합니다 .

find /var/log -iname "*.err" 

귀하의 경우에 사용 :

find yourpath -type f -a -name "?.go"

실제 경로를 경로로 바꾸어야합니다. -a즉 , And -type f일반 파일 만 찾고 있음을 의미합니다.

? 당신의 쿼리에서 당신이 기억한다면 DOS와 같은 하나의 문자를 의미합니다.


-1

ls ?.* 원하는 결과를 제공해야합니다.


Unix.SE에 오신 것을 환영합니다. 불행히도 이미 좋은 답변이 많이있는 오래된 질문에 대한 답변을 추가하는 것은 유용하지 않습니다. (오래된 문제를 해결하는 새로운 더 좋은 방법이 없거나 이전 답변보다 더 나은 솔루션이없는 경우가 아니라면) 일부 질문에 대답하려면 앞 페이지에서 새 질문을보십시오.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.