名前が2桁の数字で終わるディレクトリのファイル数を表示するLinuxコマンドは何ですか?

名前が2桁の数字で終わるディレクトリのファイル数を表示するLinuxコマンドは何ですか?

Linuxでは、ディレクトリに2桁の数字で終わるファイル名がいくつあるかを示すコマンドは何ですか?ls次のコマンドを使用してください。

ls -l | wc –l  *[0-9][0-9]

答え1

Bashでは、次の操作は非再帰的です。もちろん、関数に入れることもできます。

shopt -q nullglob || restore=1 && shopt -s nullglob
var=(*[0-9][0-9])
echo ${#var[@]}
[ 1 -eq "$restore" ] && shopt -u nullglob

これは、奇妙なファイル名がある場合でも機能します。ファイル名がおかしくない場合は、次のls方法を使用できます。

ls -d1b *[0-9][0-9] | wc -l

以前使用したフラグはls異なりました。-dコンテンツではないディレクトリを一覧表示します(something00たとえば、名前付きディレクトリがある場合)。つまり、ファイル名を-1エスケープするために単一の列を使用することを意味します。-bファイル名は機能します。 。

something00これらの両方に、数に指定されたディレクトリが含まれています。ファイルまたは再帰だけが必要な場合、findこれはあなたが探しているものです。これは現在のディレクトリ(.)を再帰的に検索し、ファイル()のみを検索します-type f

find . -type f -name '*[0-9][0-9]' -printf 'f\n' | wc -l

を使用すると-printf文字のみが印刷さfれ、ファイル名は印刷されません。クレイジーファイル名から保護できるようにファイル数を数えたいだけです。

答え2

必要でない場合は、次のコマンドをwc -l使用できます。tree

tree -P "*[0-9][0-9]" foldername/

テスト

私のフォルダの1つに2桁の数字で終わる3つのファイルを作成しました。

まず、lsを実行してすべてのファイルを表示します。

bash-3.2$ ls
1aga21  abcd  kshexp.ksh  new.txt  temp  temp1  temp12  temp2  temp3  temp34

次に、treeコマンドを使用してフォルダの1レベル上に移動します。

その後、tree次のコマンドを発行します。

bash-3.2$ tree -P "*[0-9][0-9]" jun4th/
jun4th/
|-- 1aga21
|-- temp12
`-- temp34

0 directories, 3 files

ご覧のとおり、最後の行には基準に一致するファイルの総数がリストされています。これ-血コマンドフラグはtreeモードを指定します。

編集する

derobertが指摘したように、2つの数字で終わるディレクトリがあり、そのディレクトリに2つの数字で終わる複数のファイルが含まれている場合、treeコマンドはすべてのファイルを生成してよりノイズの多い出力を生成します。元のコマンドを以下のように調整すると、これを防ぐことができます。

tree -P "*[0-9][0-9]" -L 1 jun4th/

このフラグを参照してください-L 1。これは、ファイルが現在のディレクトリの1つの下位レベルでのみ検出されることを意味します。

答え3

Perlが気に入らない場合:

perl -E '@a=<*[0-9][0-9]>;say scalar @a'

これは、(これまで提案されている他のすべての解決策と同様に)名前が2で終わるファイルの数を数えると仮定します。以上数字。ファイルfoo123も計算されます。

これが望ましくない場合は、次のPerlはすべての数を印刷します。文書(ファイルとディレクトリとは対照的に)名前は2桁の数字で終わります。

perl -E 'say scalar grep { -f && /[^0-9][0-9]{2}\z/ } <*>'

答え4

移植可能なアプローチは次のとおりですfind

find ././ ! -type d -name '*[0-9][0-9]' | grep -c '^\./\./'

そしてシェル機能は次のとおりです。

set -- ./*[0-9][0-9]
for f do
    [ -e "$f" ] && echo
done | wc -l

lsファイル名の末尾に2桁の数字しかないファイルを再帰的で移植可能に計算して一致させるには、次のようにします。

ls ./ -aR1iqp |
grep -c '^ *[0-9].*[^0-9][0-9][0-9]$' 

現在のディレクトリのみを検索するには:

ls ./.* ./* -ad1iqp |
grep -c '^ *[0-9].*[^0-9][0-9][0-9]$'

関連情報