![Bash에서 복사된 파일의 전체 크기를 인쇄합니다.](https://linux55.com/image/139879/Bash%EC%97%90%EC%84%9C%20%EB%B3%B5%EC%82%AC%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%A0%84%EC%B2%B4%20%ED%81%AC%EA%B8%B0%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
복사된 각 파일의 크기를 개별적으로 인쇄하는 대신 아래 코드에서 복사되는 파일의 전체 크기를 인쇄하고 싶습니다.
#!/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 A
file A
2
file B
file B
A+B
3
file C
file C
A+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