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


106

다음과 같이 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

답변:


109
find . -name '*.ear' -exec ls -lh {} \;

jer.drab.org의 답장에서 추가 된 h. 정신적으로 MB로 변환하는 시간을 절약합니다.)


8
이 버전은 각 파일에 대해 "ls"프로세스를 실행합니다. 파일이 많은 경우 (예 : 천 개 이상) find . -name '*.ear' -exec ls -lh {} + \;(GNU 확장자) 또는 find . -name '*.ear' -print0 | xargs -0 ls -lh. 또한 -type f파일에만 관심이있는 경우 추가 할 수 있습니다 (또는 -d내용없이 디렉토리 자체를 포함하려면 ls에 추가 ).
ash108 2012 년

2
귀하의 대답은 디렉토리를 제외하지 않으므로 디렉토리에서도 ls를 실행하게 될 것입니다. 이는 분명히 올바른 일이 아닙니다.
Faheem Mitha 2014

2
이것은 일을하는 정말 비효율적 인 방법입니다. 불행히도 ash108의 댓글도 이상적이지 않습니다. -printf 옵션을 사용하여 찾는 것이 훨씬 낫습니다.
oskarpearson

dmazzoni의 대답은 모든 파일에서 fork + exec를 피하기 때문에 훨씬 더 효율적입니다 (내 컴퓨터에서 100 배 더 빠름). % k를 % s로 변경해야했습니다. @FaheemMitha : -type f일반 파일 만 계산하는 것과 같은 옵션을 추가 할 수 있습니다 .
Mr Fooz

@FaheemMitha 쉬운 솔루션은 find . -name "*.ear" -type f파일입니다. -type d디렉토리에서 작동합니다.
anon58192932

111

-exec 또는 -printf를 사용해야합니다. Printf는 다음과 같이 작동합니다.

find . -name *.ear -printf "%p %k KB\n"

-exec는 더 강력하고 임의의 명령을 실행할 수 있도록합니다. 따라서 'ls'또는 'wc'버전을 사용하여 다른 정보와 함께 파일 이름을 인쇄 할 수 있습니다. 'man find'는 printf에 사용할 수있는 인수를 보여 주며, 파일 크기 이상을 수행 할 수 있습니다.

-printf는 공식 POSIX 표준이 아니므로 해당 버전에서 지원되는지 확인하십시오. 그러나 대부분의 최신 시스템은 GNU 찾기 또는 유사한 확장 버전을 사용하므로 구현 될 가능성이 높습니다.


귀하의 예제가 더 정확 해 보이지만 Solaris 10에서 작동하는 예제를 얻을 수없는 것 같습니다.
Brian

Solaris find는 -printf를 전혀 지원하지 않습니다 : jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks cs.bgu.ac.il/~arik/usail/man/solaris/ find.1.html 귀찮 으면 GNU find를 설치할 수 있습니다. 그렇지 않으면 exec 또는 | 다른 사람들이 제안한대로.
Leigh Caldwell

1
+1 더 깔끔해 보입니다. 출력 형식을 지정하려면 추가 column명령을 선호합니다 . find . -name *.ear -printf "%p %k KB\n" | column -t
Amol

1
이 대답은 받아 들여진 대답보다 훨씬 더 정확한 방법입니다
위협적으로

2
-printf옵션은 OS X에서도 작동하지 않습니다. stackoverflow.com/questions/752818/…을 참조하십시오 .
abeboparebop

33

간단한 해결책은 find에서 -ls 옵션을 사용하는 것입니다.

find . -name \*.ear -ls

그러면 일반 "ls -l"형식으로 각 항목이 제공됩니다. 또는 찾고있는 특정 출력을 얻으려면 다음을 수행하십시오.

find . -name \*.ear -printf "%p\t%k KB\n"

파일 이름과 KB 단위의 크기를 제공합니다.


ls옵션을 몰랐 습니다. 이것은 답변 목록에서 현재보다 훨씬 더 높을 것입니다.
Prometheus

24

gnu find를 사용하면 이것이 당신이 원하는 것이라고 생각합니다. 디렉터리 (-type f)가 아닌 모든 실제 파일을 찾고 각각에 대해 파일 이름 (% p), 탭 (\ t), 킬로바이트 (% k) 크기, 접미사 "KB"를 인쇄 한 다음 개행 (\ n).

find . -type f -printf '%p\t%k KB\n'

printf 명령이 원하는 방식으로 형식을 지정하지 않으면 exec를 사용하고 각 파일에서 실행할 명령을 사용할 수 있습니다. 파일 이름으로 {}를 사용하고 세미콜론 (;)으로 명령을 종료합니다. 대부분의 셸에서 이러한 세 문자는 모두 백 슬래시로 이스케이프되어야합니다.

다음은 "ls -lh"를 사용하여 파일을 찾아 인쇄하는 간단한 솔루션입니다. 이것은 사람이 읽을 수있는 형식 (킬로바이트의 경우 k, 메가 바이트의 경우 M)으로 크기를 표시합니다.

find . -type f -exec ls -lh \{\} \;

또 다른 대안으로 "wc -c"는 파일에있는 문자 수 (바이트)를 인쇄합니다.

find . -type f -exec wc -c \{\} \;

+1 -name '*.ear'예제에서 생략 한 것을 제외하고는 이것이 # 1 대답이어야합니다. 질문에 정확하게 답하고 구문의 의미를 설명하며 여러 대안을 제공합니다.
OsakaWebbie

이 때문에 훨씬 더 빨리 시암에서 현재 가능 하나보다, 그것은 모든 라인에 대한 새로운 명령을 실행하지 않는 한 허용 대답해야한다
jirislav

실제로 이것은 정답이어야합니다. 또한, find . -type f -printf '%k KB\t %p\n'즉, 파일 크기를 먼저 인쇄하는 것이 정렬로 인해 형식화 측면에서 더 좋은 출력이 될 가능성이 높습니다.
myradio

8
find . -name '*.ear' -exec du -h {} \;

이것은 불필요한 모든 것 대신 파일 크기 만 제공합니다.


wc바이트 단위의 크기가 필요한 경우 더 잘 작동합니다.
Alex

4

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

4

du -a를 사용하지 않는 이유는 무엇 입니까? 예

find . -name "*.ear" -exec du -a {} \;

Mac에서 작동


3

find 명령이 지원하지 않는 Mac OS X에서이 문제로 고생했습니다 -printf.

내가 찾은 해결책은 모든 파일이 '직원'인 '그룹'에 의존한다는 것을 인정합니다.

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

이것은 ls long 출력을 세 개의 토큰으로 분할합니다.

  1. 텍스트 '직원'앞의 물건
  2. 파일 크기
  3. 파일 이름

그런 다음 토큰 2와 3을 출력합니다. 즉 출력은 바이트 수와 파일 이름입니다.

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php

1
알아두면 유용합니다.의 GNU 버전은 findhomebrew를 통해 구할 수 있습니다.brew install findutils
mwfearnley

2

이렇게하면 원하는 형식을 얻을 수 있습니다 (즉, 파일 이름을 먼저 입력하고 나중에 크기를 지정).

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

1

이것을 시도해 볼 수 있습니다.

find. -name *.ear -exec du {} \;

이것은 바이트 단위의 크기를 제공합니다. 그러나 du 명령은 매개 변수 -k (KB) 및 -m (MB)도 허용합니다. 다음과 같은 출력을 제공합니다.

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear



1

다음 명령을 시도하십시오.

GNU 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 < {})"' ';'


0

총 크기가 필요한 경우 여기에 스크립트 제안이 있습니다.

#!/bin/bash
totalSize=0

allSizes=`find . -type f -name *.ear -exec stat -c "%s" {} \;`

for fileSize in $allSizes; do
    totalSize=`echo "$(($totalSize+$fileSize))"`
done
echo "Total size is $totalSize bytes"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.