私は一連のディレクトリに非常に多くのファイルを持っています。とても良いフォーマット各ディレクトリにいくつのファイルがあるかをリストします。
ディレクトリの順序は次のとおりです。親ディレクトリ名はA、B、... H、Iです。各ディレクトリの下には、001、002、... 007という名前のディレクトリが1〜7つあります。このディレクトリのファイル数を知りたいです。
私が望むのはこれです:
... C/003 122 C/004 45 C/005462 D/001 215 E/001 98 E/002 323 ...
ディレクトリ名と数の間のタブを考えています。数が左揃えか右揃えかは関係ありません。
私が自分で行うことは基本的に次のようになります。
(私のための*/* する エコ >>> $i" ls "$i" | 完了)>ファイル数
結果は次のとおりです。
... >>> F/002 30 30234 >>> F/003 120120 1322 >>>G/001 78 78 620 ...
明らかに悪くないようです。 ">>>"を交換してwc
削除wc -l
すると、はるかに優れています。とは別に各「レコード」には1行ではなく2行以上あります。
だから私に必要なのは、一部awk
またはsed
(またはどの- これらの2つのワイヤよりも2つのワイヤを接続するためのより簡単なツールはありますか? )2本の線と2本の線を1本の線につなぐ魔法。
しかし、より直接的な方法(シェルスクリプト、Perl、Python、一部本当に暗いsedとawkマジック)リストを「一度に」作成する方が良いでしょう...
答え1
ファイル名に改行文字が含まれておらず、grep
-oオプションをサポートしているとします。
find [[:upper:]] -type f | grep -Eo '^./[0-9]{3}' | sort | uniq -c
答え2
各ディレクトリごとに個別にファイル配列を作成し、要素数を計算できます。それはbash
これです。
for dir in */*/; do a=( "$dir"/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done
A/001
etc.に含めたいコンテンツがあるディレクトリも含まれている場合は、**
globを追加してください。
shopt -s globstar
for dir in */*/; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done
答え3
必要なものを取得する最も簡単な方法は、ディレクトリ名を印刷するときにオプションを使用することです-n
。echo
これにより、エコーした内容の末尾に改行文字が印刷されるのを防ぎ、次の出力が同じ行に保持されます。必要な情報を収集して出力を提供する前に複数の変換を実行したい場合は、異なる言語を選択する方が良いかもしれません。
答え4
たぶん、次のようなものがあります。
find $PWD/ -type f -printf "%h\n\0" | uniq -zc
次のようなものを生成します。
7 /foo
17 /foo/bar
9 /foo/baz
| sort -z
| uniq
並べ替えるには、前に1つを追加してください。