コマンド出力からスペースを含む Unix 互換のファイルパスを抽出します。

コマンド出力からスペースを含む Unix 互換のファイルパスを抽出します。

コマンド :

du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1

私に与えているのは:

41G     /Users/user/Big folder

パスを抽出してスクリプト内で再利用するにはどうすればいいでしょうか?

du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1 | awk '{ print $2 }'

出力します

/Users/user/Big

これは使えません。次のような結果を探しています:

/Users/user/Big\ folder

答え1

自動処理を行う場合、異なる単位の数値を使用して作業を複雑にしないでください。-hに渡さないでくださいdu。そうすれば、出力で単純な数値ソートを使用でき、ディレクトリの 1 つに 1 TB を超えるデータがあってもスクリプトは機能します。

du -s ~/* | sort -k 1n | tail -n1

最大のサブディレクトリに 1 GB 未満の容量しか含まれていない場合でも、常に 1 行が出力されます。これが望ましくない場合は、条件「出力は空か」を「数値がしきい値より小さいか」に置き換えることができます。

ディレクトリ名を抽出するには、出力を取得して最初のタブまでの部分を削除します。

largest_directory=$(du -s ~/* | sort -k 1n | tail -n1)
largest_directory_size_kB=${largest_directory%%$(printf '\t')*}  # if you need the size
largest_directory=${largest_directory#*$(printf '\t')}

答え2

POSIX: 正しい:

du -s "$HOME"/* | sort -rnk1 | LC_ALL=C sed -e "s,[^/]*\(/.*\),'\1',;q"

がなければ-hdu結果にはサイズを表す単純な数値が含まれるため、追加の なしで簡単に並べ替えることができますgrep

sed最初の行でのみ削除を実行して終了するようにすると、呼び出しが保存されますhead

答え3

必要なパスを抽出する別の方法は、作業readが終わった後にコマンドを使用して、dusort-edwhile/read

du.. sort.. | while read x d; do echo "$d"; done

関連情報