特定のディレクトリ内のディレクトリとファイルの数を見つけようとしています。私は次のようにbashスクリプトを実行しています:
ARCHIVE=/path/to/archive ./myScript
私のスクリプトではこれをしています:
#find the number of non-empty directories in the given dir
dirs=$(find $ARCHIVE -mindepth 1 -maxdepth 1 -not -empty -type d | wc -l)
#find the number of files in the given dir
msgs=$(find $ARCHIVE -type f | wc -l)
echo "Number of directories: $dirs"
echo "Total number of messages: $msgs"
これは、スクリプトと同じレベルのディレクトリにある、表示しているデータのサブセットでスクリプトを実行している場合に効果的です。ただし、実際のデータは他の誰かのディレクトリにあり、その場所に設定されたARCHIVE変数を使用して実行すると、両方の値が0として返されます。 2番目のディレクトリ。奇妙なことに、私はいくつかのegrepコマンドを使用しますが、どちらでも問題なく動作します。
この方法でfindを使用できないのはなぜですか?
検索するディレクトリをパラメータとしてbashスクリプトに渡してみてください。
#!/usr/bin/env bash
# First argument to script shall be directory in which to search
ARCHIVE=$1
#find the number of non-empty directories in the given dir
dirs=$(find "$ARCHIVE" -mindepth 1 -maxdepth 1 -not -empty -type d | wc -l)
#find the number of files in the given dir
msgs=$(find "$ARCHIVE" -type f | wc -l)
echo "Number of directories: $dirs"
echo "Total number of messages: $msgs"
ホームディレクトリでdirfiles
というスクリプトを実行します。
$ ./dirfiles ~
Number of directories: 27
Total number of messages: 8703
/usr/lib
:
$ ./dirfiles /usr/lib
Number of directories: 161
Total number of messages: 9630
さらに、find
は、シンボリックリンクを解決する3つの方法を提供します。
-P
:シンボリックリンクをたどらない-L
:シンボリックリンクをたどる-H
:コマンドライン引数を処理する場合を除き、シンボリックリンクをたどらないでください。シンボリックリンクをフォローしたくないが、$ARCHIVE
がたまたま1つである場合は、おそらく-H
が道です。
これはおそらく、他の誰かのディレクトリに読み取り権限がないために起こります。読み取り権限がない場合、コンテンツを表示/検索/検索できません。これは、次のコマンドで確認できます。
ls -l /home/username/directory
また、検索対象のファイルまたはディレクトリが実際にファイルまたはディレクトリであることも確認してください(10文字の文字列アクセス許可の最初の文字は-
またはd
であり、は他のものではありません-l
は、シンボリックリンクを表します。
ls
は、許可を10文字の文字列として表示します(例:-rw-r--r--
)。文字はTUUUGGGOOO
として解釈できます。ここで、T Type UUU Rights for the owner of the file GGG Rights for users in the group OOO Rights for others, not listed above
Tは次のいずれかです。
- file d directory c character device b block device l symbolic link
ソース: nixファイルのアクセス許可の概要
また、使用する場合:
find -type d
-ディレクトリのみを検索します。find -type f
-通常のファイルのみを検索します。