ファイルを検索して出力するスクリプトを作成しました。コマンドを使用しようとするまでスクリプトは機能します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 2
stat
stat -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 _
機能しているソリューションを見つけましたが)。