파일이 포함된 디렉터리가 있다고 가정해 보겠습니다. 예를 들어, 디렉토리
/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의 답변이 더 쉽습니다.