저는 스크립트를 작성하고 디렉터리 크기를 추출하고 싶습니다. 거기서 나는 내가 이해하지 못하는 이상한 효과를 발견했습니다.
나는 "du" 명령을 사용했습니다:
> x=$(du mydir)
> echo $x
8192 mydir
여태까지는 그런대로 잘됐다. 하지만 이제는 모든 문자를 제거하여 크기를 추출하고 싶습니다.엑스첫 번째 공간부터 시작하세요. 그런데 그때 이해가 됐어요
> echo ${x%% *}
8192 mydir
8192 뿐만이 아닙니다.
따라서 "du"에 의해 생성되지 않은 다른 변수로 확인했습니다.
> y="8192 mydir"
> echo ${y%% *}
8192
이게 왜 적용되나요?와이하지만 그렇지 않다엑스? 나도 확인했다엑스그리고와이같은 문자열입니다.
저는 여기서 정말 혼란스러워요. 누군가가 이 질문에 대답할 수 있다면 기쁘겠습니까?
답변1
변수를 큰따옴표로 묶으면 분명히 공백이 여러 개 있다는 것을 알 수 있습니다. 사실 탭 문자인데, 일부 시스템에서는 좀 더 명확하게 볼 수 있습니다.
echo "$x" | cat -e
따라서 탭(또는 공백)을 이 구조에 일치시켜 가장 긴 시퀀스를 제거할 수 있습니다."공백이나 탭 뒤에 아무 것도 포함되지 않음" 문자열 값의 끝에 바인딩$x
echo "${x%%[[:blank:]]*}"
답변2
xxd
아니면 hd
그런 것들을 조사하기 위한 좋은 도구입니다. 예:
$ du sample
32 sample
$ du sample | xxd -g 1
00000000: 33 32 09 73 61 6d 70 6c 65 0a 32.sample.
16진수 표기법이 녹슨 경우 다음을 사용할 수 있습니다 ascii
.
$ ascii -x
00 NUL 10 DLE 20 30 0 40 @ 50 P 60 ` 70 p
01 SOH 11 DC1 21 ! 31 1 41 A 51 Q 61 a 71 q
02 STX 12 DC2 22 " 32 2 42 B 52 R 62 b 72 r
03 ETX 13 DC3 23 # 33 3 43 C 53 S 63 c 73 s
04 EOT 14 DC4 24 $ 34 4 44 D 54 T 64 d 74 t
05 ENQ 15 NAK 25 % 35 5 45 E 55 U 65 e 75 u
06 ACK 16 SYN 26 & 36 6 46 F 56 V 66 f 76 v
07 BEL 17 ETB 27 ' 37 7 47 G 57 W 67 g 77 w
08 BS 18 CAN 28 ( 38 8 48 H 58 X 68 h 78 x
09 HT 19 EM 29 ) 39 9 49 I 59 Y 69 i 79 y
0A LF 1A SUB 2A * 3A : 4A J 5A Z 6A j 7A z
0B VT 1B ESC 2B + 3B ; 4B K 5B [ 6B k 7B {
0C FF 1C FS 2C , 3C < 4C L 5C \ 6C l 7C |
0D CR 1D GS 2D - 3D = 4D M 5D ] 6D m 7D }
0E SO 1E RS 2E . 3E > 4E N 5E ^ 6E n 7E ~
이를 통해 다음 사항을 빠르게 발견할 수 있습니다.
- 33 => 3
- 32 => 2
- 09 => HT 또는 가로 탭
- 73 => 초
- ...
다시 말해서. 32<HT>sample
. 33 32 20 73 ...
그것이 당신이 얻는 것이라면 공간은 0x20입니다 .
또 다른 도구는 od
여기에서 옵션을 사용하는 것 입니다 -c
( -a
또는 -ac
그것도 좋을 것입니다):
$ printf %s "$x" | od -c
0000000 3 2 \t s a m p l e
또한 올바르게 인용하면 실제 내용도 제공됩니다.
해결책은 다음과 같습니다.@roaimas 또는 이와 유사한 예
$ read -r size name<<< $(du sample)
$ echo "$size"
32
그것은 모두 당신이 원하는 것에 달려 있습니다. awk
아니면 당신이 좋은 후보자가 될 수도 있습니다.