Linuxディレクトリ内のファイルを再帰的にカウントするにはどうすればよいですか?
私はこれを見つけました:
find DIR_NAME -type f ¦ wc -l
しかし、これを実行すると、次のエラーが返されます。
検索:パスは式の前になければなりません:¦
*
、いくつかの他の文脈では、「アスタリスク」ASCII文字が、「時代」です。
Linuxディレクトリ内のファイルを再帰的にカウントするにはどうすればよいですか?
私はこれを見つけました:
find DIR_NAME -type f ¦ wc -l
しかし、これを実行すると、次のエラーが返されます。
検索:パスは式の前になければなりません:¦
*
、いくつかの他の文脈では、「アスタリスク」ASCII文字が、「時代」です。
回答:
これはうまくいくはずです:
find DIR_NAME -type f | wc -l
説明:
-type f
ファイルのみを含めます。|
(ではなく¦
)find
コマンドの標準出力をwc
コマンドの標準入力にリダイレクトします。wc
(単語数の省略)入力(docs)の改行、単語、バイトを数えます。-l
改行だけを数える。ノート:
DIR_NAME
て.
、現在のフォルダーでコマンドを実行します。-type f
て、ディレクトリ(およびシンボリックリンク)をカウントに含めることもできます。例が機能しない理由の説明:
表示したコマンドでは、「パイプ」(|
)を使用して2つのコマンドを接続するので¦
はなく、シェルがコマンドまたは類似のものとして認識しない壊れたバー()を使用しています。そのため、そのエラーメッセージが表示されます。
f
中には、-type f
ファイルのためと略wc -l
ワードカウントラインのために。
-type f
カウントにディレクトリを含めるためにを削除します
-print
旗の必要はありません
-print0
フラグを使用できます。
wc
nullで終了するリストを読み取るオプションがない限り、これは役に立ちません。代替案については私の答えを参照してください。
現在のディレクトリの場合:
find -type f | wc -l
.
find .
現在のディレクトリの下の各ディレクトリにあるファイルの数の内訳が必要な場合:
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
もちろん、すべてを1行で実行できます。括弧wc -l
は、誰の出力が(find $i -type f
この場合)監視されることになっているのかを明確にします。
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do
修正します。ファイル(データストリーム、変数)を行ごと(および/またはフィールドごと)に読み取る方法を
find
外側のループに使用するのは、不必要な面倒なことです。for i in */
; do`
使用できます
$ tree
ツリーパッケージをインストールした後
$ sudo apt-get install tree
(Debian / Mint / Ubuntu Linuxマシン上)。
このコマンドは、ファイルの数だけでなく、ディレクトリの数も個別に表示します。オプション-Lを使用して、最大表示レベル(デフォルトでは、ディレクトリツリーの最大の深さ)を指定できます。
-a
オプションを指定することにより、隠しファイルも含めることができます。
-a
、それらを含めるオプションを。
brew
して実行brew install tree
しますbrew update
。実行後に実行することをお勧めします。
私のコンピュータでrsync
はfind | wc -l
、受け入れられた答えよりも少し高速です:
$ rsync --stats --dry-run -ax /path/to/dir /tmp
Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes
2行目にはファイル数があり、上の例では150,481です。ボーナスとして、合計サイズ(バイト単位)も取得します。
備考:
--dry-run
(または-n
略して)オプションは、実際にファイルを転送しないことが重要です!-x
「ファイルシステムの境界を越えない」オプションを使用しました。つまり、実行し/
て外部ハードディスクが接続されている場合、ルートパーティションのファイルのみがカウントされます。find ~ -type f | wc -l
1.7 / 0.5 / 1.33秒かかりました(real / user / sys)。rsync --stats --dry-run -ax ~ /xxx
4.4 / 3.1 / 2.1秒かかりました。SSD上のファイル数は約500,000です。
Number of files: 487 (reg: 295, dir: 192)
rsync version 2.6.9 protocol version 29
UNIXのファイル名には改行が含まれている可能性があるため(はい、改行)、wc -l
ファイルが多すぎる可能性があります。すべてのファイルにドットを印刷してから、ドットを数えます。
find DIR_NAME -type f -printf "." | wc -c
ここでいくつかの答えを組み合わせると、最も有用な解決策は次のようになります。
find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n
スペースの括弧や改行を含むファイル名のような奇妙なことも処理できます。また、出力をファイル数でソートします。
-maxdepth
サブディレクトリもカウントされるようにするには、この数を増やします。特に、非常にネストされたディレクトリ構造と-maxdepth
多数のディレクトリを組み合わせている場合、これには時間がかかる可能性があることに注意してください。
echo -e
ですか?改行を折りたたむためにそれを入れたと思いますが、他の不規則な空白を壊し、ファイル名にそのまま存在するワイルドカード文字を展開しようとします。私は単純にのようなものに行きfind .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'
、出力に異常があればそれで生きるか、またはprintf "%q"
ディレクトリ名を出力するためにBashで遊ぶかもしれません。
現在の作業ディレクトリから存在するファイルとサブディレクトリの数を知りたい場合は、このワンライナーを使用できます
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n
これはGNUフレーバーで機能し、BSD linux(OSXなど)のechoコマンドから-eを省略します。
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
echo -e
引用符で囲まれていないディレクトリ名で(または前のコメントのように単に「echo」)を使用すると、問題が発生します。
エラーが発生しないようにwc -l
したい場合は、改行付きのファイルの表示を許可しないでください(2行以上としてカウントされます)。
たとえば、単一のEOL文字が含まれる単一のファイルがある場合を考えます。
> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2
少なくともgnuにwc
はnullで終了するリストを(ファイルからを除いて)読み取り/カウントするオプションがないように見えるため、最も簡単な解決策は、ファイル名を渡さず、ファイルが見つかるたびに静的な出力を渡すことです。上記と同じディレクトリ
> find -type f -exec printf '\n' \; | wc -l
1
またはあなたfind
がそれをサポートしている場合
> find -type f -printf '\n' | wc -l
1
コマンドを使用できますncdu
。Linuxディレクトリに含まれるファイルの数を再帰的にカウントします。次に出力の例を示します。
進行状況バーがあり、多くのファイルがある場合に便利です。
Ubuntuにインストールするには:
sudo apt-get install -y ncdu
ベンチマーク:ファイル数をカウントする必要があるフォルダーとして、https://archive.org/details/cv_corpus_v1.tar(380390ファイル、11 GB)を使用しました。
find . -type f | wc -l
:完了まで約1分20秒ncdu
:完了まで約1分20秒find . -type f | wc -l
ありませんでしたncdu
。
find
ほぼ同じシステムコールを実行しているようです。ちょうどそれらをたどった。du
ncdu
現在のディレクトリにあるファイルの数を確認するには、を入力しls -1 | wc -l
ます。これは、の出力のwc
行数のカウントに使用されます。ドットファイルはカウントされません。このHOWTOの以前のバージョンで使用した(前の例のように "1"ではなく "L"である)と、実際のファイル数よりも1つ多いファイル数が得られることに注意してください。この点についてはカムネジャドに感謝します。(-l)
ls -1
ls -l
ファイルのみを数え、シンボリックリンクを含まない場合(他にできることのほんの一例)、使用できますls -l | grep -v ^l | wc -l
(これは今回は「1」ではなく「L」です。ここでは「長い」リストが必要です)。 。grep
"l"(リンクを示す)で始まる行をチェックし、その行を破棄します(-v)。
相対速度:「ls -1 / usr / bin / | wc -l」は、アンロードされた486SX25で約1.03秒かかります(このマシンの/ usr / bin /には355ファイルあります)。「ls -l /usr/bin/ | grep -v ^l | wc -l
」には約1.19秒かかります。
ls -l
stat
サイズ、mtime、その他のプロパティを読み取るには、すべてのファイルでsyscallを実行する必要がありますが、これは低速です。大きなディレクトリ(100.000以上のファイル)では、実行ls -l
に数分かかる場合があります。したがって、ファイルのみをカウントするには、常にを使用しますls -1 | wc -l
。
bashの場合:
()でエントリの配列を作成し、#でカウントを取得します。
FILES=(./*); echo ${#FILES[@]}
ファイルを再帰的に数えませんが、シンプルなオプションを最初に表示したいと思います。一般的な使用例は、ファイルのロールオーバーバックアップを作成する場合です。これにより、logfile.1、logfile.2、logfile.3などが作成されます。
CNT=(./logfile*); mv logfile logfile.${#CNT[@]}
bash 4+をglobstar
有効にした再帰的なカウント(@tripleeeで言及)
FILES=(**/*); echo ${#FILES[@]}
ファイルの数を再帰的に取得するために、同じようにfindを使用できます。
FILES=(`find . -type f`); echo ${#FILES[@]}
**/*
は再帰的な列挙をサポートしています。find
シェルは各ディレクトリ内のファイルを並べ替える必要があるため、大きなディレクトリよりも効率的ではありません。
名前にスペースが含まれるディレクトリの場合...(上記のさまざまな回答に基づく)-ディレクトリ名とその中のファイル数を再帰的に出力します。
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
例(読みやすいようにフォーマットされています):
pwd
/mnt/Vancouver/Programming/scripts/claws/corpus
ls -l
total 8
drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'
ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
138
## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
29
ディレクトリ構造は以下を使用してより視覚化されtree
ます:
tree -L 3 -F .
.
├── Catabolism - Autophagy; Phagosomes; Mitophagy/
│ ├── 1
│ ├── 10
│ ├── [ ... SNIP! (138 files, total) ... ]
│ ├── 98
│ └── 99
└── Catabolism - Lysosomes/
├── 1
├── 10
├── [ ... SNIP! (28 files, total) ... ]
├── 8
├── 9
└── aaa/
└── bbb
3 directories, 167 files
man find | grep mindep
-mindepth levels
Do not apply any tests or actions at levels less than levels
(a non-negative integer). -mindepth 1 means process all files
except the starting-points.
ls -p | grep -v /
(以下で使用)は/unix/48492/list-only-regular-files-but-not-directories-in-current-directoryの回答2からのものです
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1
適用: 私は数百のディレクトリ(すべての深さ= 1)の中でファイルの最大数を見つけたいです
date; pwd
Fri Mar 29 20:08:08 PDT 2019
/home/victoria/Mail/2_RESEARCH - NEWS
time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
0:00.03
[victoria@victoria 2_RESEARCH - NEWS]$ head -n5 ../../aaa
./RNA - Exosomes: 26
./Cellular Signaling - Receptors: 213
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Stress - Physiological, Cellular - General: 261
./Ancient DNA; Ancient Protein: 34
[victoria@victoria 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)
0: ./Genomics - Gene Drive
1: ./Causality; Causal Relationships
1: ./Cloning
1: ./GenMAPP 2
1: ./Pathway Interaction Database
1: ./Wasps
2: ./Cellular Signaling - Ras-MAPK Pathway
2: ./Cell Death - Ferroptosis
2: ./Diet - Apples
2: ./Environment - Waste Management
988: ./Genomics - PPM (Personalized & Precision Medicine)
1113: ./Microbes - Pathogens, Parasites
1418: ./Health - Female
1420: ./Immunity, Inflammation - General
1522: ./Science, Research - Miscellaneous
1797: ./Genomics
1910: ./Neuroscience, Neurobiology
2740: ./Genomics - Functional
3943: ./Cancer
4375: ./Health - Disease
sort -V
自然な種類です。...つまり、これらの(Claws Mail)ディレクトリのいずれかにあるファイルの最大数は4375ファイルです。これらのファイル名を左パディング(https://stackoverflow.com/a/55409116/1904943)した場合、これらのファイル名はすべて、各ディレクトリで1から始まる数値で名前が付けられ、合計5桁になるようにパディングされます。 。
補遺
ディレクトリ内のファイル、サブディレクトリの総数を見つけます。
$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS
$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News
Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine
$ find . -type f | wc -l
70214 ## files
$ find . -type d | wc -l
417 ## subdirectories
find -type f | wc -l
または(ディレクトリが現在のディレクトリの場合)
見つける -type f | wc -l
¦
(ASCII 166)とUNIXパイプラインに|
使用される垂直バー(ASCII 124)を混同しています。