du -sh --exclude={} の cat/echo コマンドにより実行時間が長くなり、期待どおりに動作しません。

du -sh --exclude={} の cat/echo コマンドにより実行時間が長くなり、期待どおりに動作しません。

私はこのページが好きで、ここで答えを見つけることができたらと思います。

そのため、特定のファイルシステム(一部の要件に応じて動的に生成された保存ファイルに保存)で、一部のディレクトリを除くすべてのディレクトリのディスク使用量を確認したいと思います。

しかし、除外コマンドに値を直接ハードコーディングすると、速度が非常に速く、結果も正確であることが観察されました。しかし、除外コマンドにコマンドを渡すとき。この作業は時間がかかり、誤った結果をもたらします。いつもハードコーディングしたくない。提案してください。

エンコードされたバージョン(a、bはサブディレクトリ) - 正しい結果を提供する

du -sh --exclude={a,b} filesystem/*

コマンドバージョン

aとbのディレクトリ名を含むファイル(directory_list.txt)があるとします。

du -sh --exclude={`cat directory_list.txt`} /filesystem/*

また、思い出されるのは、除外によって正確で時宜を得た結果が出ないので、希望のディレクトリだけを選択すればよいということです。

次のように

ls filesystem/ | grep -v $(cat directory_list.txt) > selected.txt  --

ディレクトリ以外の必要なディレクトリのみを選択してください。

du -sh $(cat selected.txt)

しかし、より良い方法と、私のコマンドが除外コマンドで機能するようにする方法を提案してください。ありがとう Muhammad

ベストアンサー1

Linuxのコマンドdu(使用中のように見える)は、次の--exclude-fromオプションを提供します。

du -h -s --exclude-from=directory_list.txt /filesystem/*

または

du -h -s -X directory_list.txt /filesystem/*

これは、ファイルdirectory_list.txtに除外する必要がある1行に1つのシェルワイルドカードパターン(正規表現ではない)が含まれていると仮定します。これらのパターンはパス名、単にファイルまたはディレクトリ名、またはシェルワイルドカード文字を含めることができます。


使用しているコマンドで--exclude={`cat directory_list.txt`}シェルに中括弧拡張を使用させたいとしますdirectory_list.txt。支柱の拡張を実行しても機能しません。今後コマンドの置き換えも検討してください。

あなたは何ですかできるdu存在しない場合は、--exclude-fromファイルから除外する項目を配列として読み、各--exclude=要素に追加してから、呼び出しでその配列を使用しますdu

exclude=()
while IFS= read -r item; do
    exclude+=( --exclude="$item" )
done <directory_list.txt

du -h -s "${exclude[@]}" /filesystem/*

--exclude-fromこれは、ファイルが1行に1つのパターンを含むと仮定します。

使用しているシェルが配列をサポートしていない場合は、入力数を減らすことができます。

set --
while IFS= read -r item; do
    set -- "$@" --exclude="$item"
done <directory_list.txt

du -h -s "$@" /filesystem/*

これは、名前付き配列の代わりに位置引数のリストを使用します。

どちらのループもパス名のスペースも保持し、シェルがファイル名のグロービングパターンを誤って拡張することを許可しません。これはコマンドに関連するいくつかの問題ですgrep -v $(cat directory_list.txt)。もう1つは、ファイルのパス名のほとんどをgrep検索するファイルに渡すことです。除外するパターンの代わりに)。

おすすめ記事