コマンド出力からスペースを含む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

最大のサブディレクトリに1GB未満が含まれていても、常に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

フロント:

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

それ以外の場合、-h結果duには単純なサイズの数値が含まれているため、追加の作業なしで簡単に並べ替えることができますgrep

最初の行で削除を使用して終了するsedと、head通話が保存されます。

答え3

必要なパスを抽出する別の方法は、readこれらduのタスクを実行した後にコマンドを渡しsort-edwhile/read

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

関連情報