3

過去45日間に編集された、すべてのディレクトリ内のファイルの数を再帰的に取得するbashスクリプトがあります。

 find . -type f -mtime -45| rev | cut -d . -f1 | rev | sort | uniq -ic | sort -rn

私はというディレクトリを持っています

\parent

そして親には私が持っています:

\parent\a
\parent\b
\parent\c

上記のスクリプトをフォルダaで1回、1回、1回実行bしますc

現在の出力は次のとおりです。

     91 xls
     85 xlsx
     49 doc
     46 db
     31 docx
     24 jpg
     22 pub
     10 pdf
      4 msg
      2 xml
      2 txt
      1 zip
      1 thmx
      1 htm
      1 /ic

\parent内部のすべてのフォルダーからスクリプトを実行して、次の\parentような出力を取得したいと思います。

+-------+------+--------+
| count | ext  | folder |
+-------+------+--------+
|    91 | xls  | a      |
|    85 | xlsx | a      |
|    49 | doc  | a      |
|    46 | db   | a      |
|    31 | docx | a      |
|    24 | jpg  | a      |
|    22 | pub  | a      |
|    10 | pdf  | a      |
|     4 | msg  | a      |
|    98 | jpg  | b      |
|    92 | pub  | b      |
|    62 | pdf  | b      |
|     2 | xml  | b      |
|     2 | txt  | b      |
|     1 | zip  | b      |
|     1 | thmx | b      |
|     1 | htm  | b      |
|     1 | /ic  | b      |
|    66 | txt  | c      |
|    48 | msg  | c      |
|    44 | xml  | c      |
|    30 | zip  | c      |
|    12 | doc  | c      |
|     6 | db   | c      |
|     6 | docx | c      |
|     3 | jpg  | c      |
+-------+------+--------+

どうすればbashでこれを達成できますか?

4

1 に答える 1

5

それをスクリプトに入れ、実行可能にします:chmod +x script.shそしてそれを実行します:./script.sh

#!/bin/sh

find . -type f -mtime -45 2>/dev/null \
    | sed 's|^\./\([^/]*\)/|\1/|; s|/.*/|/|; s|/.*.\.| |p; d' \
    | sort | uniq -ic \
    | sort -b -k2,2 -k1,1rn \
    | awk '
BEGIN{ 
    sep = "+-------+------+--------+"
    print sep "\n| count | ext  | folder |\n" sep
}

{ printf("| %5d | %-4s | %-6s |\n", $1, $3, $2) }

END{ print sep }'
  • sed 's|^\./\([^/]*\)/|\1/|; s|/.*/|/|; s|/.*.\.| |p; d'

    1. s|^\./\([^/]*\)/.*/|\1 |に置き換え./a/file.xlsますa/file.xls
    2. s|/.*/|/|に置き換えb/some/dir/file.mp3ますb/file.mp3
    3. s|/.*.\.| |pで置き換えます。成功a file.xlsしたa xls場合s///pは、標準出力にも出力されます(拡張子のないファイルを避けるため)。
    4. d行を削除します(一致する行または一致しない行を印刷しないようにするため)。
  • sort | uniq -ic拡張子とディレクトリ名の各グループをカウントします。

  • sort -b -k2,2 -k1,1rn最初にディレクトリ(フィールド2)、小さい->大きい、次にカウント(フィールド1)の逆順(大きい->小さい)および数値でソートします。空白(スペース/タブ)-bを無視します。sort(1)

  • 最後のawk部分は出力をきれいに出力します。おそらく、これを別のスクリプトに入れたいと思うでしょう。

各パイプが結果をどのようにフィルタリングするかを確認したい場合は、それぞれを削除してみてください。出力が表示されます。

ここでは、sh / awk/sedなどに関する優れたチュートリアルを見つけることができます。

http://www.grymoire.com/Unix/

于 2013-01-31T20:51:15.820 に答える