2017-03-18 2 views
0

特定のディレクトリ(そのサブディレクトリを含む)で最大のファイルを探すスクリプトを書く必要があります。テキストツリーを解析して最大のファイルを見つけるBashスクリプト

私は "ツリー"を使ってすべてのファイルのテキスト表現を生成すると、多分サイズを比較して最大のものを出力するスクリプトを持つことができます。

私は出力最大、その後、私は必要なすべてのスクリプトがリストを読んで、リストが終了するまでサイズを比較することです、今、この

. 
[  939] "./Documents/Alfa/driver/wlan0up" 
[  234] "./Documents/Alfa/driver/wpa1.conf" 
[ 1623520] "./Documents/Alfa/driver/wpa_supplicant-0.5.5.zip" 
[ 5488640] "./Documents/Alfa/R36-V1.2.1.2b6.img" 
[  3385] "./Documents/C code/Ide.s" 
[  4096] "./Documents/fluxion-master" 
[   25] "./Documents/fluxion-master/_config.yml" 
[  4096] "./Documents/fluxion-master/docs" 
[  35141] "./Documents/fluxion-master/docs/LICENSE" 
[  83788] "./Documents/fluxion-master/fluxion" 
~~ long list of other files 
[  6909] "./.ZAP/session/untitled2.script" 
[  64411] "./.ZAP/zap.log" 
[  4096] "./.zenmap" 
[   0] "./.zenmap/recent_scans.txt" 
[  2018] "./.zenmap/scan_profile.usp" 
[   85] "./.zenmap/target_list.txt" 
[  1486] "./.zenmap/zenmap.conf" 
[  409600] "./.zenmap/zenmap.db" 
[   5] "./.zenmap/zenmap_version" 

429 directories, 3327 files 

ようになり、テキストファイルになってしまいましたファイルの名前とサイズ

私はsedとgrepを使っていくつかの他のstackoverflowエントリを調べましたが、運が得られませんでした。

Read a file line by line assigning the value to a variable

Looping through the content of a file in Bash?

https://codereview.stackexchange.com/questions/59417/extracting-data-from-text-file-in-bash-using-awk-grep-head-and-tail

そのツリーは、XMLファイルとして出力をフォーマットすることができ、タグを使用してXMLファイルを解析することは簡単ですので、もし<directory name="fileName" size="XXXX"></directory> などの属性、ということに注意してくださいあまりにも良いでしょう。

フォルダもそこにリストされていますが、無視できます。

すべてのヘルプは数字で、あなただけの一覧の並べ替え、 おかげ

+0

あなたの質問を詳しく解説します:ファイルサイズ*またはファイル内の行数で*最大のファイル*を検索するには? – RomanPerekhrest

+0

申し訳ありませんが、私はサイズで意味し、角かっこの間の数はバイトです。とにかくソリューションは本当に簡単でした..ありがとう – Mo3tasm

答えて

1

を高く評価し、最初の行つかむことになります。私はあなたが生成するためにかなり大きなスクリプトを持っている感覚を持っている

sort -V yourList.txt | head -n 

をリスト。リストは少し安全でもありません。ファイル名に改行が含まれているとどうなりますか(はい、これはLinux上で可能です)?次のコマンドは、現在のディレクトリ(サブディレクトリを含む)で最大のファイルを検索し、サイズと名前を出力します。

find . -type f -exec du -b {} + | sort -nr | head -n 1 

ファイルだけの場合は、末尾に| sed 's/^[0-9]\+\t//'を追加します。

1

treeを使用しないでください。代わりに、ファイルを繰り返し処理し、statを呼び出して、これまでに見た最大のファイルを覚えて各ファイルのサイズを取得してください。 bash 4以降では、あなたが利用可能zshを持っている場合、それはfname=$(zsh -c 'print **/*(OL[1])')のと同じくらい簡単です

shopt -s globstar 
for f in **/*; do 
    size=$(stat -c %s) 
    if ((size > max_size)); then 
     max_size=$size 
     max_file=$f 
    fi 
done 

のと同じくらい簡単です。

bashの以前のバージョンを使用すると、**をシミュレートするために、再帰関数を定義する必要があります。

dir_iter() { 
    for f in "$1"/*; do 
     if [[ -d $f ]]; then 
      dir_iter "$f" 
     else 
      size=$(stat -c %s) 
      if ((size > max_size)); then 
       max_size=$size 
       max_file=$f 
      fi 
     fi 
    done 
} 
dir_iter . 

(あなたは変更になる場合がありますstatコマンドの正確な形式、については、最寄りのマニュアルを参照する必要があることに注意してください。たとえば、BSD statは、-cの代わりに-fを使用します。)


一つの異議は、それがstatへの複数の呼び出しを必要とすることです。これは高価ですが、ファイル名のシーケンス(ファイル名に改行を含めることができれば複雑です)を扱うことの(明らかにまれな)問題 は避けてください。

zshが利用可能な場合は、max_file=$(zsh -c 'print **/*(OL[1])')と同じくらい簡単です。実際にzshを使用している場合は、それはちょうどprint -v max_file **/*(OL[1])です。

あなたは改行を含むファイル名を心配しないことを決定した場合、次の操作を行うことができます。

find . -exec stat -c '%s %n' {} + | sort -k2,2nr | head -1 

私は読者への課題として、改行を含むファイル名を扱うのまま。通常は、任意の文字列のシーケンスを適切に表すことができる別の言語を使用します。別のオプションは、bashソースディストリビューションのexamples/loadablesディレクトリにあるfinfoコマンドを調べることです。これは、新しいプロセスを作成せずにstatと同じことをするシェル組み込みコマンドを作成する例です。出力からシェル変数を設定できるように、printfでサポートされているのと同様の-vオプションを追加するように変更することができます。

finfo -v size -s "$f" # equivalent to size=$(stat -c %s "$f"), but all in shell 
関連する問題