파일 이름과 함께 파일 크기를 인쇄하는 find 명령을 어떻게 얻나요?

StackOverflow https://stackoverflow.com/questions/64649

문제

다음과 같이 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 긴 출력을 세 개의 토큰으로 나눕니다.

  1. '직원'이라는 텍스트 앞에 있는 내용
  2. 파일 크기
  3. 파일 이름

그런 다음 토큰 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 {} \;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top