출력 파일 크기를 함께 추가하는 방법

출력 파일 크기를 함께 추가하는 방법
158416
757249
574994
144436
520739
210444
398630
1219080
256965
684782
393445
157957
273642
178980
339245
6014031

현재 디렉토리의 파일 크기는 다음과 같습니다. 다음 명령을 사용하여 얻었습니다.

ls -l | tr -s " " | cut -d " " -f5 | tail +2

어쨌든 cut, echo, eval, head, ls, tail, tr다음 명령을 사용하여 이러한 크기 15개를 모두 추가하면 모든 파일의 전체 크기를 얻을 수 있습니다.

답변1

그 명령 목록에는 숫자를 추가할 수 있는 명령이 없으므로 쉘의 산술 확장을 사용해야 할 것 같습니다.

그것은 다음과 같습니다:

echo "$(($(LC_ALL=C ls -nq | tr -s ' ' | cut -d ' ' -f5 | tail -n +2 | tr '\n' +)0))"

(이는 파일이 장치 파일이 아니며 출력에 ls -l다섯 번째 열의 크기가 아니라 장치 주요 번호가 있다고 가정 합니다.)

ls -lor 의 출력은 로캘별로 다르며 ls -n/ 이외의 로캘에서는 지정되지 않습니다.CPOSIX

또한 그렇지 않은 경우 -q이름이나 심볼릭 링크 대상에 개행 문자가 포함된 파일에서는 작동하지 않습니다.

사용하지 않으면 -q임의의 명령 주입 취약점이 발생합니다.누군가 악의적인 이름을 가진 파일을 생성할 수 있는 디렉터리에서 명령을 실행하시겠습니까(예: ln -s $'\nx x x x a[$(reboot)0]' x없이 실행한 후 시도 -q)

-n공백 문자를 포함할 수 있는 ID가 아닌 사용자/그룹 이름을 가져오려고 합니다 .-l-l

더 이상 tail +2사용되지 않습니다. 표준 구문은 입니다 tail -n +2.

답변2

"file.txt"라는 파일에 번호를 입력한 다음

var=$(cat file.txt)
echo $((${var//$'\n'/+}))

기본적으로 부정맥 표현의 패턴은 ${parameter//find/replace}, 또는 우리의 경우 ${var// /+}. 이것은Bash 매개변수 확장:

- `\n` will add blank spaces between the numbers in the list
- The double slashes `//` are for replacing all occurrences of space with `+` sign, if you put one slash `/`, only first space is going to be replaced. The space is there because you are replacing space with plus sign.

이전 솔루션은 다음과 같이 단순화될 수 있습니다.

var=echo $(< file.txt)
echo $((${var// /+}))

그러나 두 솔루션 모두 다음과 같은 문제를 안고 있습니다.명령 대체후행 개행 문자가 잘릴 수 있습니다.

여기

답변3

붙여넣기와 BC를 사용하십시오.

$ paste -sd + file | bc
12283035

답변4

Bash를 사용한 $(( ))산술 연산 :

ACC=0
for i in $(command to get sizes); do ACC=$((i + ACC)); done
echo $ACC

관련 정보