파일을 출력하는 동안 파일 크기를 어떻게 출력합니까?

파일을 출력하는 동안 파일 크기를 어떻게 출력합니까?

파일을 검색한 다음 출력하는 스크립트를 작성했습니다. 명령을 사용하려고 할 때까지 스크립트가 작동합니다 du. 코드는 다음과 같습니다

#!/bin/bash

echo "Enter either file name or format:"
    read File

echo "Input the absolute path to directory:"
    read Dir

echo "Enter \"/path/to/directory/filename\" to store outputs on the filename:"
    read results

#cd $Dir; 
#for dir in */; do 
#   echo $Dir; 
#done | xargs -P0 -I_ echo "sudo find _ -type f -name \*$File\* " > temp.txt

cd $Dir; 
for dir in */; do 
  echo $dir; 
done | xargs -P0 -I_ sudo find _ -type f -name \*$File\* | du >> $results

기본적으로 입력 파일을 검색하려는 디렉토리를 검색하고 xargs거기에 있는 코어를 최대한 활용합니다.

지금 필요한 것은 출력 파일의 크기와 results출력할 파일뿐입니다. 직접 이 작업을 수행하면 포함된 모든 디렉터리에 잘못된 출력이 표시되고 검색한 파일을 찾을 수 없습니다. 어떤 아이디어가 있나요?

답변1

코드에 일부 오류가 있습니다.

cd $Dir

cd실패할 수 있지만 스크립트는 계속 진행되므로(폴더 이름의 공백으로 인해 실패하므로) 스크립트에 사용하면 안 됩니다 . 성공 했는지 확인하는 것이 더 좋습니다 cd. 두 가지 예는 다음과 같습니다.

cd "$Dir" || exit 2
cd "$Dir" && for dir in */; do

sudo스크립트에서는 사용하면 안 됩니다. 올바른 권한으로 스크립트를 실행하는 것이 더 좋습니다(단지 의견)

sudo find _ -type f -name \*$File\*

find루프가 필요한 경우 루프 안에 넣을 수 있습니다. 필요하지 않습니다 xargs. (의견)

for dir in */; do echo $dir; done

for 루프는 별로 의미가 없지만(아무것도 없기 때문에) 사용할 수 있습니다 ls -d */. 하위 폴더( 로 시작하는 숨겨진 폴더 제외 .)만 인쇄하거나 find */직접 인쇄할 수도 있습니다(더 좋음 cd "$Dir" && find ./*/).

\*$File\* | du >> $results

문자열을 전달하지 마십시오 du. 예상한 대로 작동하지 않습니다. 파일 이름을 인수로 사용하면 xargs더 나은 방법으로 이를 수행 할 수 있습니다 -exec( \;각 파일을 개별적으로 처리하거나 +모든 파일 이름을 한 번에 인수로 전달하려면).

for dir in */; find "$dir" -type f -iname "*$File*" -exec du {} + >> "$results"; done

그러나 find하위 폴더 대신 상위 폴더에서 직접 실행할 수 있으며 파일 크기의 경우 (디스크 사용량을 정말로 원하지 않는 한) 다음과 같은 원하는 출력을 사용하는 것이 좋습니다."$dir""$Dir"-mindepth 2statstat -c %s$'\t'%n

find "$Dir" -mindepth 2 -type f -iname "*$File*" -exec stat -c %s$'\t'%n {} + >> "$results"

또는 xargs -0너무 많은 매개변수가 전달된 경우stat

find "$Dir" -mindepth 2 -type f -iname "*$File*" -print0 | xargs -0 -P0 stat -c %s$'\t'%n >> "$results"

폴더 이름을 더 안전하게 처리하려면 읽기 동안 찾기 루프를 사용하여 결과를 NUL 종료하는 것이 좋습니다(GNU 확장 -print0). 참조용으로 이 답변을 참조하세요( xargs -I_ find _이미 작동하는 솔루션을 찾았지만).

find에서 반환된 파일 이름을 어떻게 반복합니까?

관련 정보