특정 임계값을 초과하는 여러 디렉터리의 가장 큰 파일을 포함하는 압축 아카이브를 생성하는 스크립트를 작성하고 싶습니다. 예를 들어, 2MB보다 큰 파일 5개를 가져와서 largestfile.tar.gz
지금까지 가지고 있는 파일에 넣는 방법을 알고 싶습니다 .
du -a $path | sort -n -r | head -n 5 > diskspacefile.txt
file=$(cat diskspacefile.txt)
while read p; do
filesize=echo $p | awk '{print $1 }'
if [ $filesize > 2000000 ]
then
zipfile=`echo $p | awk '{print $2 }'`
tar -zcvf largestfile.tar.gz $zipfile
fi
done
불행히도 이것은 작동하지 않는 것 같습니다. 실행하면 아카이브에 파일이 하나만 표시되거나 파일이 전혀 표시되지 않습니다. 맥락상 내가 관심을 갖는 디렉터리는 및(즉 , 코드 조각의 변수 값 /root
이 됩니다 )입니다./boot
path
답변1
먼저, 이를 사용하여 find
특정 디렉터리에서 2MB보다 큰 모든 파일 목록을 생성할 수 있습니다.
find . -type f -size +2M
우리는 이 목록에서 가장 큰 파일 5개를 추출하려고 합니다. 이를 위해 -printf
아래와 같이 파일 경로와 파일 크기를 바이트 단위로 인쇄하는 옵션을 사용할 수 있습니다 .
find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n'
이제 이러한 결과를 파일 크기(내림차순)별로 정렬할 수 있으며 순서가 지정된 목록의 처음 5개 결과를 정렬할 수 있습니다.
find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1
다음으로 파일 크기를 삭제하여 현재 디렉터리에서 2M가 넘는 가장 큰 5개 파일의 상대 경로를 검색합니다.
find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-
tar
마지막으로, 이러한 파일의 압축된 아카이브를 생성하기 위해 이 파일 경로 목록을 명령에 전달할 수 있습니다 .
tar czf largestfile.tar -T <(find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-)