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 -l
or 의 출력은 로캘별로 다르며 ls -n
/ 이외의 로캘에서는 지정되지 않습니다.C
POSIX
또한 그렇지 않은 경우 -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