여러 디렉터리에 있는 두 개의 해당 문자열 사이의 파일 수를 계산합니다.

여러 디렉터리에 있는 두 개의 해당 문자열 사이의 파일 수를 계산합니다.

파일이 포함된 디렉터리가 있다고 가정해 보겠습니다. 예를 들어, 디렉토리

/home/me/files/files_10
/home/me/files/files_11
/home/me/files/files_12

각 파일에는 마지막 숫자에 해당하는 일부 파일이 포함되어 있습니다. 예를 들어, /home/me/files/files_10 디렉토리에는 다음 파일이 포함되어 있습니다.

/home/me/files/files_10/file_100.txt
/home/me/files/files_10/file_102.txt
/home/me/files/files_10/file_105.txt
/home/me/files/files_10/file_106.txt
etc

파일 번호는 점점 커지지만 반드시 모든 번호를 포함할 필요는 없습니다(이 경우 101, 103, 104가 누락되었기 때문입니다).

두 입력 값 사이의 파일 수를 계산하려고 합니다. 위의 예에서 첫 번째 값이 100이고 두 번째 값이 105인 경우 출력이 3이 되기를 원합니다. 첫 번째 값이 103이고 두 번째 값이 106인 경우 출력이 2가 되기를 원합니다. 또한, 내가 제공하는 첫 번째 값은 112이고 두 번째 값은 125라고 가정해 보겠습니다. 해당 디렉터리(11과 12로 끝남)로 이동하여 이 두 값 사이의 파일 수를 계산하고 싶습니다.

이것은 제가 사용하는 것의 단순화된 버전이지만 기능은 동일합니다. 이를 달성할 수 있는 솔루션은 무엇입니까? 감사해요!

답변1

이 시도,

 ls /home/test/files/*/file_{112..125}.txt 2> /dev/null | wc -l

답변2

물론 사용할 수도 있지만 find덜 일반 updatedb 적이고 locate.

먼저, 후속 명령에서 사용할 updatedb기존 파일의 데이터베이스를 만들어야 합니다 . locate가서 /home/me/files다음을 수행하십시오.

updatedb --require-visibility 0 -o locate.db -U .

locate이제 Bash 구문과 함께 사용하여 {a..b} 파일 목록을 검색할 준비가 되었습니다 . 예를 들어:

$ locate -d ./locate.db file_{112..125}.txt
./files_11/file_112.txt
./files_11/file_113.txt
./files_12/file_124.txt
./files_12/file_125.txt
$ locate -d ./locate.db file_{100..105}.txt
./files_10/file_100.txt
./files_10/file_102.txt
./files_10/file_105.txt
$ locate -d ./locate.db file_{103..106}.txt
./files_10/file_105.txt
./files_10/file_106.txt

발견된 파일 수만 표시하려면 locate출력을 파이프하십시오 wc -l.

이 솔루션의 장점은 locate매우 빠르게 작동한다는 것입니다.

단점은 새 파일이 추가되거나 이름이 변경되거나 사용될 때마다 inotify데이터베이스를 수동으로 다시 생성해야 하며 발견된 파일 이름을 NUL로 바꿀 수 없으므로 파일에 새 줄이 있는 경우 잘못된 반환이 locate발생한다는 것입니다. wc -l그들의 이름으로.

답변3

x부터 y까지의 숫자가 포함된 파일 개수만 계산하려면 다음을 수행하세요.

$ tree files/
files/
├── file_100.txt
├── file_102.txt
├── file_105.txt
└── file_106.txt

0 directories, 4 files


$ start=103; end=106; echo files/* \
  | grep -o '[[:digit:]]*' \
  | awk '{ if ($1 >='$start' && $1 <= '$end') {++count}} END { print count }'
2

그러나 파일 이름에 공백이나 개행 문자가 없다고 확신하면 @msp9011의 답변이 더 쉽습니다.

관련 정보