파일 이름 길이로 모든 파일을 찾고 싶습니다.
예를 들어 나는 같은 길이 1의 파일을 찾으려면 a.go, b.go.
나는 넣었다 :
grep '.\{1\}' file
그러나 이것은 작동하지 않습니다. 파일 이름 길이로 파일을 찾는 데 어떤 명령을 사용할 수 있습니까?
파일 이름 길이로 모든 파일을 찾고 싶습니다.
예를 들어 나는 같은 길이 1의 파일을 찾으려면 a.go, b.go.
나는 넣었다 :
grep '.\{1\}' file
그러나 이것은 작동하지 않습니다. 파일 이름 길이로 파일을 찾는 데 어떤 명령을 사용할 수 있습니까?
답변:
grep파일 내용에서 패턴을 찾습니다. 당신이보고 싶은 경우 이름 의 파일 (현재 디렉토리에서만 파일 이름 고려할 경우), 당신은 단지 쉘 글로브를 사용할 수 있습니다 :
echo ?.go
(그런데, 그것은 echo명령이 아니라 글로브를 평가하는 쉘입니다 .)
현재 디렉토리부터 시작하여 디렉토리를 재귀 적으로 찾으려면 사용할 도구는 find다음과 같습니다.
find . -name '?.go'
(쉘을 find호출 하기 전에 쉘이 글로브로 평가하지 않도록 패턴을 인용해야합니다 .)
파일 이름 만 찾으려면 다음 명령을 사용할 수 있습니다.
find -exec basename '{}' ';' | egrep '^.{100,}$'
를 find사용하여 basename파일 또는 디렉토리의 이름을 뽑은 다음 100 자 이상의 파일 이름 또는 디렉토리 이름을 찾으십시오. 정확한 길이의 파일 이름을 찾으려면 {100}대신을 사용하십시오 {100,}.
경로를 포함한 파일 이름을 찾으려면 다음을 수행하십시오.
find | egrep '/[^/]{100,}$'
find 명령을 실행 한 상대 경로를 포함한 파일 이름을 반환합니다.
우선, 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}\.[^.]+$'
참고 : 위의 솔루션은 줄 바꿈 문자가 포함되어 있지 않은 상대적으로 정상적인 파일 이름을 가지고 있다고 가정합니다. 길이를 계산할 때 파일 이름의 공백을 무시하지 않는 것으로 간주합니다. 원하는 길이가 아닐 수도 있습니다. 이 중 하나라도 문제가 있으면 알려 주시면 답변을 업데이트하겠습니다.
지정하지는 않지만 파일이 디렉토리 구조 내에 있으면 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
ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . 또한이 Q는 OSX로 태그가 지정되지 않았으므로 사용에 적합 grep합니다.
나는 이것과 같은 것을 사용할 것입니다.
find . -type f -name "?.go"
두 개를 넣으면 "?" 그런 다음 두 글자와 확장자를 가진 파일 이름을 찾고 있습니다.
ls ?.* 원하는 결과를 제공해야합니다.
a.go길이 4a의 파일 이름입니다. 길이 1의 파일 이름입니다. 이것은 이름과 확장자가 분리되어 있고 암시 적이.항상 파일 이름의 일부인 DOS가 아닌 Unix 입니다.