ファイルの出力中にファイルサイズをどのように出力しますか?

ファイルの出力中にファイルサイズをどのように出力しますか?

ファイルを検索して出力するスクリプトを作成しました。コマンドを使用しようとするまでスクリプトは機能しますdu。コードは次のとおりです

#!/bin/bash

echo "Enter either file name or format:"
    read File

echo "Input the absolute path to directory:"
    read Dir

echo "Enter \"/path/to/directory/filename\" to store outputs on the filename:"
    read results

#cd $Dir; 
#for dir in */; do 
#   echo $Dir; 
#done | xargs -P0 -I_ echo "sudo find _ -type f -name \*$File\* " > temp.txt

cd $Dir; 
for dir in */; do 
  echo $dir; 
done | xargs -P0 -I_ sudo find _ -type f -name \*$File\* | du >> $results

デフォルトでは、入力ファイルを検索したいディレクトリを検索し、xargsそこにあるコアを最大限に活用します。

今必要なのは、出力ファイルのサイズとresults出力するファイルだけです。これを直接行うと、含まれているすべてのディレクトリに無効な出力が表示され、検索したファイルが見つかりません。どんなアイデアがありますか?

ベストアンサー1

コードにいくつかのエラーがあります。

cd $Dir

cd失敗する可能性がありますが、スクリプトは続行されるため(フォルダ名の空白が原因で失敗するため)、スクリプトには使用しないでください。成功したことを確認する方が良いですcd。 2つの例は次のとおりです。

cd "$Dir" || exit 2
cd "$Dir" && for dir in */; do

sudoスクリプトでは使用しないでください。正しい権限でスクリプトを実行することをお勧めします(ただのコメント)

sudo find _ -type f -name \*$File\*

findループが必要な場合は、ループに入れることができます。必要ありませんxargs。 (コメント)

for dir in */; do echo $dir; done

forループはあまり意味がありませんが(何もないため)使用できますls -d */。サブフォルダ(で始まる隠しフォルダを除く.)のみを印刷するか、find */直接印刷することもできます(より良いcd "$Dir" && find ./*/)。

\*$File\* | du >> $results

文字列を渡さないでくださいdu。期待どおりに動作しません。ファイル名を引数として使用すると、xargsより良い方法でこれを行うことができます-exec\;各ファイルを個別に処理したり、+すべてのファイル名を一度に引数として渡したい場合)。

for dir in */; find "$dir" -type f -iname "*$File*" -exec du {} + >> "$results"; done

ただし、findサブフォルダの代わりに親フォルダから直接実行できますが、ファイルサイズの場合(ディスク使用量が本当に望まない場合)、次のような出力を使用することをお勧めします。"$dir""$Dir"-mindepth 2statstat -c %s$'\t'%n

find "$Dir" -mindepth 2 -type f -iname "*$File*" -exec stat -c %s$'\t'%n {} + >> "$results"

または、あまりにもxargs -0多くのパラメータが渡された場合stat

find "$Dir" -mindepth 2 -type f -iname "*$File*" -print0 | xargs -0 -P0 stat -c %s$'\t'%n >> "$results"

フォルダ名をより安全に処理するには、読み取り中に検索ループを使用して結果をNUL終了することをお勧めします(GNU拡張-print0)。参考のためにこの回答を参照してください(すでにxargs -I_ find _機能しているソリューションを見つけましたが)。

findから返されたファイル名をどのように繰り返すのですか?

おすすめ記事