모두,
find 명령을 사용하여 특정 폴더의 모든 png 파일을 필터링하고 해당 파일과 크기를 나열하는 스크립트가 있습니다. 다음 형식으로 출력하고 싶습니다.
someFile.png => 1.2K
저는 awk를 사용하여 $5(인간 친화적인 형식의 파일 크기)와 $9(경로)를 얻습니다. 이것이 내가 현재 사용하고 있는 것입니다:
find "$somePath" -iname "*.png" -print0 | xargs -0 ls -lh | awk '{print $9,"=>",$5}'
때로는 파일 이름이나 경로에 공백이 있어서 스크립트 오류가 발생하는 경우가 있습니다. 다음은 샘플 출력입니다.
/Users/test/Desktop/Test/image1 => 1.2K
/Users/test/Desktop/Test/image1.png => 1.4K
출력의 첫 번째 항목은 "image1 test.png"라는 파일입니다. ls 출력을 구문 분석해서는 안 된다는 내용을 어딘가에서 읽었습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
답변1
일반적으로, 출력을 다른 프로그램으로 파이프하는 대신 exec를 사용하여 find가 원하는 작업을 수행하도록 할 수 있습니다.
find "$somePath" -iname "*.png" -printf '%p => %s\n'
인간과 유사한 차원이 정말로 필요한 경우에는 조금 더 복잡합니다.
find "$somePath" -iname "*.png" -exec printf '{} => ' \; -exec sh -c 'ls -sh "{}" | cut -f1 -d\ ' \;
마지막 것은 parsing 이지만 ls
, 내가 아는 한 여기서는 첫 번째 열만 가져오고 한 번에 개별 항목에 대해 작업하기 때문에 첫 번째 열에 공백을 포함할 수 없습니다. 목록) 상관없습니다. 그렇지 않으면 다른 프로그램을 사용하여 치수를 표시할 수 있습니다. BSD와 Linux에서는 를 사용할 수 있습니다 stat
. Solaris에서는 파일 크기를 출력하기 위해 자체 프로그램을 작성해야 할 수도 있습니다.
중요한 것은 find
원하는 것을 수행하는 데 항상 사용할 수 있다는 것입니다.전체 파일 이름- 이렇게 하면 적절한 구분 기호 없이 목록에서 파일 이름을 추출하려고 시도하지 않습니다.
답변2
가장 편리한 방법은 find에서 printf를 사용하는 것이지만, 이는 정확히 여러분이 찾고 있는 옵션은 아닙니다. %k는 크기를 K로 인쇄하지만 크기는 디스크에 할당되므로 설정에 따라 항상 4k의 배수(내 시스템에서처럼) 또는 이와 유사한 것일 수 있습니다.
find -name "C*.png" -printf "%f => %k \n"
CalculatorVergleich.png => 28
ClassifierImage.png => 8
ClassifierImage.png => 8
바이트 단위의 옵션이 있습니다.
find -name "C*.png" -printf "%f => %s \n"
CalculatorVergleich.png => 26256
ClassifierImage.png => 6313
ClassifierImage.png => 6473
%b는 점유된 512b 블록을 나타냅니다.
find -name "C*.png" -printf "%f => %b \n"
CalculatorVergleich.png => 56
ClassifierImage.png => 16
ClassifierImage.png => 16
어쩌면 그것이 당신에게 효과가 있을까요? 파일 이름의 공백은 문제가 되지 않습니다.
답변3
ls -l이 제공하는 추가 정보를 얻기 위해 awk를 사용하여 ls -l을 처리한다고 가정합니다. 일반적으로 find 및 stat는 재현 가능한 결과를 더 많이 제공하지만 ls를 자유롭게 사용해도 됩니다.
ls -l의 좋은 점 중 하나는 너비가 고정되어 있다는 것입니다. 따라서 substr을 줄의 시작으로 사용할 수 있으며 길이를 지정하지 않아도 됩니다. 길이는 줄 끝까지의 모든 문자를 포함합니다.
아래 예에서는 파일 이름을 문자열에 할당한 다음 공백을 밑줄로 바꿉니다. 나는 일반적으로 추가 분석을 위해 awk를 사용하므로 파일 이름의 공백을 지우면 분석이 더 쉬워지고 최종 결과는 사람에게 맡깁니다.
$ ls -al | awk '{myfilename=substr($0, 57);gsub(/ /,"_",myfilename);print myfilename}'
나는 find를 사용하여 일반적으로 몇 시간에 걸쳐 파일 시스템을 크롤링하고 모든 파일에 대한 통계를 저장한 다음 나중에 분석하기 위해 주요 필드를 추출합니다.
myPath="./"
find "$myPath" -type f -print0 | xargs -0 stat -c"%W %w %Y %y %X %x %9s %n" > myTemp.txt
cat myTemp.txt | awk '{myfilename=substr($0, 152);gsub(/ /,"_",myfilename);printf "%s %s %12s %s\n", $6,$10,$13,myfilename}'
또한 이제 공백이 밑줄로 표시되므로 정렬된 열을 다시 정렬하지 않고도 파일 이름에 대한 결과를 정렬할 수 있습니다.
| sort -k 4