파일 이름 길이로 모든 파일을 찾고 싶습니다.
예를 들어 길이가 1인 파일을 찾으려면 a.go
, b.go
.
나는 다음을 넣었다:
grep '.\{1\}' file
그러나 이것은 작동하지 않습니다. 파일 이름 길이로 파일을 찾으려면 어떤 명령을 사용할 수 있나요?
답변1
파일 이름만 찾으려면 다음 명령을 사용하면 됩니다.
find -exec basename '{}' ';' | egrep '^.{100,}$'
이 명령은 를 실행하고 find
파일 또는 디렉터리 이름을 추출한 basename
다음 최소 100자 길이의 파일 이름 또는 디렉터리 이름을 찾습니다. 파일 이름의 정확한 길이 {100}
를 찾으려면 {100,}
.
경로가 포함된 파일 이름을 찾으려면 다음을 수행하십시오.
find | egrep '/[^/]{100,}$'
그러면 find 명령이 실행된 상대 경로를 포함하여 파일 이름이 반환됩니다.
답변2
grep
파일 콘텐츠에서 패턴을 찾아보세요. 보고 싶다면이름이러한 파일의 경우 쉘 glob을 사용할 수 있습니다(현재 디렉토리의 파일 이름만 고려하려는 경우).
echo ?.go
(그런데, glob을 평가하는 것은 command가 아닌 쉘입니다 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