web-dev-qa-db-ja.com

findが変数で機能しない

特定のディレクトリ内のディレクトリとファイルの数を見つけようとしています。私は次のように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を使用できないのはなぜですか?

3
turbo

検索するディレクトリをパラメータとして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が道です。

1
ladaghini

これはおそらく、他の誰かのディレクトリに読み取り権限がないために起こります。読み取り権限がない場合、コンテンツを表示/検索/検索できません。これは、次のコマンドで確認できます。

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-通常のファイルのみを検索します。
1
Radu Rădeanu