スクリプトエラーです。 findコマンドは空白文字のあるフォルダをスキップしています。

スクリプトエラーです。 findコマンドは空白文字のあるフォルダをスキップしています。

ディレクトリ(およびサブディレクトリ)のファイル数を数えるスクリプトが必要です。次のスクリプトをインポートし、必要に応じて変更しました。

空白文字を含むフォルダを除いて同じ方法で動作します。どこかに引用がないことは確かですが、まだ把握することはできません。

追加情報

  • Linux 2.6.22.19-0.4-default(このサーバーはもはや生産されません)
  • GNUバージョン4.2.31を探す
  • ディレクトリ名を変更できません。

ディレクトリ構造の例

.
..
01_infos
02_sent
03_inbox
04_public and private
197.
145.
329.
13.

スクリプト

#!/bin/bash
# Write a script that will count the number of files in each of your subdirectories.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------

START=$HOME

# change your directory to command line if passed
# otherwise use home directory
[ $# -eq 1 ] && START=$1 || :

if [ ! -d $START ]
then
        echo "$START not a directory!"
        exit 1
fi

# use find command to get all subdirs name in DIRS variable
DIRS=$(find "$START" -type d)

# loop thought each dir to get the number of files in each of subdir
for d in $DIRS
do
        echo "$d directory has $(find "$d" -maxdepth 1 -regex '.*\.' -type f | wc -l) files" || :
done

出力

./01_infos directory has 1 files
./02_sent directory has 9 files
./03_inbox has 4 files
find: ./04_public: No such file or directory

ベストアンサー1

いくつかの二重引用符がありません(変数の置換には常に二重引用符を使用してください。$foo変数置換とコマンド置換には常に二重引用符を使用してください。$(foo)、安全に去ることができる理由と離れなければならない理由を知らない場合)。しかし、それはすべてではありません。

if [ ! -d $START ]

しなければならないif [ ! -d "$START" ]

DIRS=$(find "$START" -type d)

このとき、DIRS再帰は開始ディレクトリとそのサブディレクトリの名前で構成され、その間には改行が含まれます。そのため、改行文字を含むディレクトリ名があると迷子になります。ディレクトリ名からどの改行文字が出ているのか、区別記号​​であるのかを知ることはできません。ファイル名に改行文字がないことを知っていれば、出力を解析できますが、findどうすればわかりますか?

ところで、ここに二重引用符がなくても大丈夫です。$(…)これは変数の割り当てであり、割り当て内の置換は暗黙的に保護されるためです。しかし、export DIRS=$(…)同様に保護されていません。シェルスクリプトに慣れていない限り、引用符を使用するのが最善です。スクリプトを維持するすべての人も同じです。

for d in $DIRS

ここで失敗します。$DIRS単語で区切りたいので、二重引用符を入れることはできませんが、すべての要素が一緒に連結されるので二重引用符が$DIRS必要です。


一般的に使用する場合は、オプションでfind処理コマンドを呼び出す必要があります-exec。ファイル名を厳密に制御しない限り、出力を解析しないでくださいfind。あいまいです。

find "$START" -type d -exec sh -c '
    echo "$0 directory has $(find "$0" -maxdepth 1 -regex ".*\\." -type f -printf \\n | wc -l) files whose name ends with ."
' {} \;

埋め込みfindコマンドで解析された出力にfind改行文字が含まれていると、計算はオフになります。

おすすめ記事