「du」コマンドの出力から最初の単語(サイズ)を抽出するために$ {xx%% *}を使用できないのはなぜですか?

「du」コマンドの出力から最初の単語(サイズ)を抽出するために$ {xx%% *}を使用できないのはなぜですか?

私はスクリプトを作成し、ディレクトリサイズを抽出したいと思います。そこで私は理解していない奇妙な効果を見つけました。

私は "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>sample33 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または、あなたは良い候補者かもしれません。

関連情報