파일 이름의 길이로 모든 파일을 찾고 싶습니다.
a.go
예를 들어 , , 와 같이 길이가 1인 파일을 찾으려면 b.go
.
나는 다음을 넣었다:
grep '.\{1\}' file
그러나 이것은 작동하지 않습니다. 파일 이름 길이로 파일을 찾으려면 어떤 명령을 사용할 수 있습니까?
답변1
파일 이름만 찾으려면 다음 명령을 사용할 수 있습니다.
find -exec basename '{}' ';' | egrep '^.{100,}$'
그러면 가 실행되어 다음을 find
사용하여 파일이나 디렉터리 이름을 가져온 basename
다음 최소 100자 이상의 파일 이름이나 디렉터리 이름을 찾습니다. 정확한 길이의 파일 이름 을 찾으려면 {100}
.{100,}
경로를 포함한 파일 이름을 찾으려면 다음을 수행하십시오.
find | egrep '/[^/]{100,}$'
그러면 find 명령을 실행한 상대 경로를 포함한 파일 이름이 반환됩니다.
답변2
grep
파일 내용에서 패턴을 찾습니다. 당신이보고 싶다면이름파일 중에서 쉘 글로브를 사용할 수 있습니다(현재 디렉토리의 파일 이름만 고려하려는 경우).
echo ?.go
(그런데 명령이 아닌 glob을 평가하는 것은 쉘입니다 echo
.)
현재 디렉토리부터 시작하여 디렉토리를 재귀적으로 검색하려는 경우 사용할 도구는 다음과 같습니다 find
.
find . -name '?.go'
(셸이 호출되기 전에 패턴을 glob으로 평가하는 것을 방지하려면 패턴을 인용해야 합니다 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
명령은 ./
. 플래그 는 PCRE -P
에 필요한 Perl 호환 정규식을 활성화하고 "문자열의 끝과 일치"를 의미합니다.{n}
$
간단히 다음과 같이 할 수도 있습니다.
find . -type f | grep -P '/...$'
길이가 15인 파일 이름과 일치하도록 15개의 점을 입력하는 작은 숫자의 경우에는 괜찮습니다. 그다지 효율적이지 않습니다.
마지막으로 확장자를 무시하고 파일 이름만 일치시키려면 다음을 수행하십시오(@slm 제안대로).
find . -type f | grep -P '/.{1}\.'
그러나 이렇게 하면 a.bo.go
. 파일 이름에 둘 이상이 포함될 수 있으면 더 좋습니다 .
.
find . -type f | grep -P '/.{1}\.[^.]+$'
참고: 위의 해결 방법은 새 줄 문자 등을 포함하지 않는 비교적 정상적인 파일 이름을 가지고 있다고 가정합니다. 또한 원하는 길이가 아닐 수 있는 길이를 계산할 때 파일 이름의 공백을 무시하지 않는 것으로 계산됩니다. 둘 중 하나라도 문제가 있는 경우 알려주시면 답변을 업데이트하겠습니다.
답변4
지정하지는 않지만 파일이 디렉토리 구조 내에 있는 경우 다음을 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