ディレクトリ内のファイルのカウント

ディレクトリ内のファイルのカウント

スクリプトの最後に次のコードを使用して、処理してそのディレクトリに移動したファイルの数を集計します。

# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l

私の問題は、重複ファイルの処理方法にあります。現時点では、最初にファイルの存在を確認します (スクリプトは、処理中のソース ファイルに対して本質的に破壊的であるため)。その名前のファイルがすでに処理されていると検出された場合は、次のようにファイル名を変更します。

重複ファイル: foo.pdf

名前を変更しました: foo.x.pdf

foo.x.pdf がある場合は、再度 foo.xx.pdf に名前を変更します。必要に応じて繰り返します。後で各「バージョン」を評価し、手元に置いておくのに最適なものを選択するつもりです。しかし、ここに問題があります。.x、.xx などを含まないファイルの数をカウントしたいと思います。出力からこれらを削除して、ls一意wc -lのファイルのみをカウントするにはどうすればよいですか?

TL;DR: 特定のディレクトリ内で、ファイル名に特定の部分文字列を含まないファイルの数を取得するにはどうすればよいですか?

答え1

ディレクトリ内の を含まないファイルの数を確認するには.x.pdf、次を試してください。

find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c

xディレクトリ内でピリオド (1 つ以上- ピリオド - )を含まないファイルの数を見つけるにはpdf、次を試してください。

find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

上記はサブディレクトリを再帰的に検索します。これを望まない場合は、オプションを追加します-maxdepth 1。例:

find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

を使用しているため-printf '1'、ディレクトリ内に改行文字を含む名前のファイルが含まれていても、この方法は安全であることに注意してください。

答え2

サブディレクトリなし:

echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))

なぜなら:

for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0

答え3

オプション, ( をls1回以上使用することで、パターンに一致するファイルをコマンドから除外することができます。-I--ignore=PATTERN参照):

ls -I "*.x*.pdf" "${Destination}" | wc -l

または、減算法を次のように使用することもできます。

echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))

関連情報