私はスクリプトを作成し、ディレクトリサイズを抽出したいと思います。そこで私は理解していない奇妙な効果を見つけました。
私は "du"コマンドを使用しました:
> x=$(du mydir)
> echo $x
8192 mydir
今まではそんなに良くなった。しかし、今ではすべての文字を削除してサイズを抽出したいと思います。X最初のスペースから始めましょう。ところで、当時は理解できました。
> echo ${x%% *}
8192 mydir
8192だけではありません。
そのため、「du」によって生成されなかった他の変数で確認しました。
> y="8192 mydir"
> echo ${y%% *}
8192
これはなぜ適用されますか?ワイしかしそうではありませんX?私も確認しましたXそしてワイ同じ文字列です。
私はここで本当に混乱しています。誰かがこの質問に答えることができたら嬉しいですか?
答え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
または、あなたは良い候補者かもしれません。