파일 이름과 함께 파일 크기를 인쇄하는 find 명령을 어떻게 얻나요?
-
09-06-2019 - |
문제
다음과 같이 find 명령을 실행하면:
$ find . -name *.ear
다음과 같이 인쇄됩니다.
./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear
명령줄에 '인쇄'하고 싶은 것은 이름과 크기입니다.
./dir1/dir2/earFile1.ear 5000 KB
./dir1/dir2/earFile2.ear 5400 KB
./dir1/dir3/earFile1.ear 5400 KB
해결책
find . -name '*.ear' -exec ls -lh {} \;
jer.drab.org의 답변에서 추가로 h를 추가하세요.정신적으로 MB로 변환하는 시간을 절약합니다. ;)
다른 팁
-exec 또는 -printf를 사용해야 합니다.Printf는 다음과 같이 작동합니다.
find . -name *.ear -printf "%p %k KB\n"
-exec는 더욱 강력하며 임의의 명령을 실행할 수 있게 해줍니다. 따라서 'ls' 또는 'wc' 버전을 사용하여 다른 정보와 함께 파일 이름을 인쇄할 수 있습니다.'man find'는 단순한 파일 크기 이상의 일을 할 수 있는 printf에 사용 가능한 인수를 보여줍니다.
[편집] -printf는 공식 POSIX 표준이 아니므로 해당 버전에서 지원되는지 확인하세요.그러나 대부분의 최신 시스템은 GNU find 또는 유사한 확장 버전을 사용하므로 구현될 가능성이 높습니다.
간단한 해결책은 find에서 -ls 옵션을 사용하는 것입니다.
find . -name \*.ear -ls
그러면 일반적인 "ls -l" 형식의 각 항목이 제공됩니다.또는 찾고 있는 특정 출력을 얻으려면 다음을 수행하십시오.
find . -name \*.ear -printf "%p\t%k KB\n"
그러면 파일 이름과 크기(KB)가 표시됩니다.
Gnu find를 사용하면 이것이 당신이 원하는 것이라고 생각합니다.디렉터리가 아닌 모든 실제 파일을 찾고(-type f) 각 파일에 대해 파일 이름(%p), 탭( ), 킬로바이트 단위 크기(%k), 접미사 " KB"를 인쇄한 다음 개행( ).
find . -type f -printf '%p\t%k KB\n'
printf 명령이 원하는 방식으로 형식을 지정하지 않으면 exec를 사용한 다음 각 파일에서 실행하려는 명령을 사용할 수 있습니다.파일 이름으로 {}를 사용하고 세미콜론(;)으로 명령을 종료합니다.대부분의 셸에서 해당 세 문자는 모두 백슬래시로 이스케이프되어야 합니다.
다음은 사람이 읽을 수 있는 형식(k는 킬로바이트, M은 메가바이트)으로 크기를 표시하는 "ls -lh"를 사용하여 이를 찾아 인쇄하는 간단한 솔루션입니다.
find . -type f -exec ls -lh \{\} \;
또 다른 대안으로 "wc -c"는 파일의 문자 수(바이트)를 인쇄합니다.
find . -type f -exec wc -c \{\} \;
find . -name '*.ear' -exec du -h {} \;
이렇게 하면 불필요한 모든 항목 대신 파일 크기만 제공됩니다.
Awk는 질문자가 요청한 내용을 제공하도록 출력을 수정할 수 있습니다.내 Solaris 10 시스템에서 find -ls는 두 번째 필드로 크기(KB)를 인쇄하므로 다음과 같습니다.
% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear
그렇지 않으면 -exec ls -lh를 사용하고 출력에서 크기 필드를 선택하십시오.다시 Solaris 10에서:
% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear
왜 사용하지 않습니까? 뒤 -a ?예:
find . -name "*.ear" -exec du -a {} \;
Mac에서 작동
find 명령이 지원되지 않는 Mac OS X에서 이 문제로 어려움을 겪었습니다. -printf
.
내가 찾은 솔루션은 '직원'인 모든 파일에 대해 '그룹'에 의존하는 것으로 인정됩니다.
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'
이는 ls 긴 출력을 세 개의 토큰으로 나눕니다.
- '직원'이라는 텍스트 앞에 있는 내용
- 파일 크기
- 파일 이름
그런 다음 토큰 2와 3을 출력합니다.출력은 바이트 수와 파일 이름입니다.
8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
이렇게 하면 서식이 포함되어 원하는 것을 얻을 수 있습니다(예:파일 이름이 먼저, 크기가 뒤에옴):
find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'
샘플 출력(내가 사용한 곳은 -iname "*.php"
결과를 얻으려면) :
./plugins/bat/class.bat.inc.php 20K
./plugins/quotas/class.quotas.inc.php 8.0K
./plugins/dmraid/class.dmraid.inc.php 8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php 4.0K
./index.php 4.0K
./config.php 12K
./includes/mb/class.hwsensors.inc.php 8.0K
다음을 시도해 볼 수 있습니다.
find. -name *.ear -exec du {} \;
그러면 크기가 바이트 단위로 제공됩니다.그러나 du 명령은 KB의 경우 -k 매개변수, MB의 경우 -m 매개변수도 허용합니다.그것은 당신에게 다음과 같은 출력을 줄 것입니다
5000 ./dir1/dir2/earFile1.ear
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \; 4.0K ./test1 0 ./test2 0 ./test3 0 ./test4 $
다음 명령을 시도해 보십시오:
암소 비슷한 일종의 영양 stat
:
find . -type f -name *.ear -exec stat -c "%n %s" {} ';'
BSD stat
:
find . -type f -name *.ear -exec stat -f "%N %z" {} ';'
하지만 stat
표준이 아니므로 du
또는 wc
더 나은 접근 방식이 될 수 있습니다.
find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;