ファイルシステムで大きなディレクトリを見つける関数を作成していますが、/n
そのディレクトリはパスを含むすべての配列要素で切り捨てられます。/native/proc...
私はこれが私のIFSとして「\ n」を使用することに関連していると思いますが、それがなければ、各列を私が望むものではない独自の要素に分割するので、他の方法がわかりません。私が必要とするのは、独自の配列要素の各行全体です。このコマンドはどのようにして独自に印刷されますか?
[root@JBLGSMM001 ~]# du -k / 2> /dev/null | sort -n | tail -n 10
255452 /usr/share
332644 /native/proc/82974
342119 /native/proc/70315
344519 /native/proc/70310
388510 /native/usr
683983 /usr
1226993 /native/proc/45026
9597039 /native/proc
10035430 /native
10846908 /
これまでの特徴
where.isdisk () {
bigstuff=$(du -k / 2> /dev/null | sort -n | tail -n 10)
OLDIFS=$IFS
IFS="\n"
bigstuff=($bigstuff)
IFS=$OLDIFS
}
変数bigstuff
は次のように私が望む方法で設定されます。
255452 /usr/share 332644 /native/proc/82974 342119 /native/proc/70315 344519 /native/proc/70310 388510 /native/usr 683983 /usr 1226989 /native/proc/45026 9772351 /native/proc 10210742 /native 11022217 /
その後、配列を作成すると「/n」が切り捨てられます。
[root@JBLGSMM001 ~]# OLDIFS=$IFS
[root@JBLGSMM001 ~]# IFS="\n"
[root@JBLGSMM001 ~]# bigstuff=($bigstuff)
[root@JBLGSMM001 ~]# IFS=$OLDIFS
[root@JBLGSMM001 ~]# echo ${bigstuff[@]}
255452 /usr/share 332644 / ative/proc/82974 342119 / ative/proc/70315 344519 / ative/proc/70310 388510 / ative/usr 683983 /usr 1226989 / ative/proc/45026 9772351 / ative/proc 10210742 / ative 11022217 /
編集する
また、「/」を前の要素に転送します。
[root@JBLGSMM001 ~]# echo ${bigstuff[0]}
255452 /usr/share 332644 /
[root@JBLGSMM001 ~]# echo ${bigstuff[1]}
ative/proc/82974 342119 /
[root@JBLGSMM001 ~]# echo ${bigstuff[2]}
ative/proc/70315 344519 /
[root@JBLGSMM001 ~]# echo ${bigstuff[3]}
ative/proc/70310 388510 /
編集2
\n
に置き換えようとしましたが、\012
まだ望ましくない結果が発生します。
[root@JBLGSMM001 ~]# bigstuff=$(du -k / 2> /dev/null | sort -n | tail -n 10)
[root@JBLGSMM001 ~]# OLDIFS=$IFS
[root@JBLGSMM001 ~]# IFS="\012"
[root@JBLGSMM001 ~]# bigstuff=($bigstuff)
[root@JBLGSMM001 ~]# IFS=$OLDIFS
[root@JBLGSMM001 ~]# echo ${bigstuff[@]}
5545 /usr/share 33 644 /native/proc/8 974 34 9 /native/proc/7 3 5 3445 9 /native/proc/7 3 3885 /native/usr 683983 /usr 6989 /native/proc/45 6 977 387 /native/proc 778 /native 55 /
[root@JBLGSMM001 ~]# echo ${bigstuff[0]}
[root@JBLGSMM001 ~]# echo ${bigstuff[1]}
5545
[root@JBLGSMM001 ~]# echo ${bigstuff[2]}
/usr/share 33
[root@JBLGSMM001 ~]# echo ${bigstuff[3]}
644 /native/proc/8
この問題を解決する方法を知っている人はいますか?ありがとうございます!
答え1
シェルは\n
in をIFS
改行文字として解釈するのではなく、文字として解釈しますn
(エスケープされます。ここでは何もしません)。/
前の項目は削除されn
ません。
IFS
改行文字を設定するには、次のようにします。
IFS='
'
bash
「C文字列」(そのうちの1つとして)を理解するシェルでは、次のものも使用できます。
IFS=$'\n'