Bash에서 복사된 파일의 전체 크기를 인쇄합니다.

Bash에서 복사된 파일의 전체 크기를 인쇄합니다.

복사된 각 파일의 크기를 개별적으로 인쇄하는 대신 아래 코드에서 복사되는 파일의 전체 크기를 인쇄하고 싶습니다.

#!/bin/bash
input_folder=/a/b/c
output_folder=/d/e/f

cd $input_folder

for i in *.tiff; do
  size=$(wc -c < ${i})    
  cp -v ${i} $out | sleep 1 | echo -ne "$size%\033[0K\r"
done

bash매초 복사되는 파일의 크기를 인쇄합니다 .

예를 들어, 두 번째로 크기를 1복사 하고 인쇄합니다 . 둘째, 파일의 전체 크기가 아닌 파일의 크기를 복사하여 인쇄합니다 . 두 번째 단계에서는 파일의 전체 크기 대신 파일 크기를 복사 하고 인쇄합니다.file Afile A2file Bfile BA+B3file Cfile CA+B+C

어떻게 해야 합니까 bash?

답변1

단일 크기를 요약하면 됩니다 echo.

#!/bin/bash
input_folder=/a/b/c
output_folder=/d/e/f

cd $input_folder

size_sum=0    
for i in *.tiff; do
  size=$(wc -c < ${i})    
  size_sum=$((size_sum + size))
  cp -v ${i} $out | sleep 1 
done

echo ${size_sum}

답변2

size=$(wc -c < ${i})    

이는 파일 크기를 얻는 매우 현명한 방법은 아닙니다. wc그렇게 달리는 것은읽다원하는 것은 파일 시스템이 이미 알고 있고 알려줄 수 있는 크기이기 때문에 실제로는 완전히 불필요한 전체 파일입니다.

그런 다음 어떤 경우에도 파일을 읽어야 하도록 파일을 복사하여 이러한 상황을 완화합니다. 이 시간 동안 적당한 크기의 파일이 캐시에 남아 있을 수 있으므로 읽기가 실제로 디스크에 도달하지 않습니다. 그러나 여전히 치수를 읽는 것이 합리적입니다.

GNU 유틸리티 를 사용하면 stat -c %s "$filename".stat

cp -v ${i} $out | sleep 1 | echo -ne "$size%\033[0K\r"

여기 파이프가 이상해 보이네요. cp(표준 출력으로) 출력이 생성되지 않습니다. 적어도 출력이 없는 경우에는 생성되지 않으므로 -i파이프할 것이 없습니다. 그렇더라도 sleep아무 것도 읽히지 않으므로 모든 출력이 cp낭비됩니다. sleep와 사이에도 같은 일이 일어납니다 echo. 이는 기본적으로 파이프가 일반적으로 사용되는 것과 정반대이지만 모든 명령이 병렬로 실행되고 쉘이 모든 명령이 완료될 때까지 기다리므로 파이프가 실행되는 데 최소 1초가 걸립니다. , 복사 속도에 관계없이.

$(( .. ))파일 크기를 합산하려면 셸의 산술 확장이 필요할 수 있습니다. 따라서 추가로 잠을 자지 않고도 다음을 수행할 수 있습니다.

dest=/path/to/destination
total=0
for file in *.tiff; do
    size=$(stat -c %s "$file");
    printf "current %d total %d\n" "$size" "$((total += size))"
    cp -- "$file" "$dest"
done

답변3

스크립트에 산술 연산을 저장하려면 파일 연결 크기만 가져오면 됩니다.

cat *.tiff | wc

UN*X 커널은 사용자와 협력하여 파일 크기만 얻는 것만큼 효율적으로 만듭니다.

답변4

+=변수가 정수로 선언되면 합산될 수 있습니다.

$ declare -i size
$ size+=100; echo "$size"
100
$ size+=200; echo "$size"
300

귀하의 스크립트(변수 확장을 올바르게 인용함):

#!/bin/bash
input_folder=./a/b/c
output_folder=./d/e/f
declare -i size

for i in "$input_folder"/*; do
  size+=$(wc -c < "${i}")    
  cp -v "${i}" "$output_folder" | sleep 1 | echo -ne "$size\033[0K\r"
done

관련 정보