ls -ld と find を使用すると、ディレクトリー内のファイルが印刷されます。

ls -ld と find を使用すると、ディレクトリー内のファイルが印刷されます。

私は与えられたUIDとGIDを持つすべてのファイルをリストするためにfindを使います。ファイルセットのさまざまなプロパティを印刷する必要があるため、ファイルのリストを一時ファイルに保存しています。これらの属性の1つはインストールGIDを含むファイルです。一時ファイルの内容を配列に入れました。

a=$( < $tmpfile)

cupsパッケージの場合、tmpfileの内容は次のとおりです。

/usr/share/cups
/usr/share/cups/banners
/usr/share/cups/data
/usr/share/cups/doc-2.2.6
/usr/share/cups/doc-2.2.6/apple-touch-icon.png
/usr/share/cups/doc-2.2.6/cups.css
/usr/share/cups/doc-2.2.6/cups-printable.css
/usr/share/cups/doc-2.2.6/de
/usr/share/cups/doc-2.2.6/de/index.html
/usr/share/cups/doc-2.2.6/es
/usr/share/cups/doc-2.2.6/es/index.html
/usr/share/cups/doc-2.2.6/help
/usr/share/cups/doc-2.2.6/help/accounting.html
/usr/share/cups/doc-2.2.6/help/api-admin.html
/usr/share/cups/doc-2.2.6/help/api-filter.html
/usr/share/cups/doc-2.2.6/help/api-ppd.html
/usr/share/cups/doc-2.2.6/help/api-raster.html
/usr/share/cups/doc-2.2.6/help/cgi.html
/usr/share/cups/doc-2.2.6/help/cupspm.html
/usr/share/cups/doc-2.2.6/help/encryption.html

など....

次に、次のように配列を検索します。

echo "files with group install"
for file in ${a[@]}; do
  find $file -type f -user $userid -group install -exec ls -l {} \;
  find $file -type d -user $userid -group install -exec ls -ld {} \;
done

ここで、2番目のルックアップはそのディレクトリの下のファイルを印刷するため、インストールGIDを持つサブディレクトリは2回印刷されます。これは ls -ld があるにもかかわらず発生します。したがって、カップの結果は次のようになります。

drwxrwxr-t 16 cups install 4096 Dec  1 17:28 /usr/share/cups
drwxrwxr-t 2 cups install 4096 Dec  1 17:28 /usr/share/cups/ppdc
drwxrwxr-t 2 cups install 4096 Dec  1 17:21 /usr/share/cups/model
drwxrwxr-t 2 cups install 4096 Dec  1 17:28 /usr/share/cups/banners
drwxrwxr-t 3 cups install 4096 Dec 13 16:53 /usr/share/cups/drv
drwxrwxr-t 2 cups install 4096 Dec 13 16:53 /usr/share/cups/mime
drwxrwxr-t 2 cups install 4096 Dec  1 17:28 /usr/share/cups/data
drwxrwxr-t 2 cups install 4096 Dec  1 17:26 /usr/share/cups/usb
drwxrwxr-t 2 cups install 4096 Dec  1 17:28 /usr/share/cups/banners
drwxrwxr-t 2 cups install 4096 Dec  1 17:28 /usr/share/cups/data
drwxrwxr-t 3 cups install 4096 Dec 13 16:53 /usr/share/cups/drv
drwxrwxr-t 2 cups install 4096 Dec 13 16:53 /usr/share/cups/mime
drwxrwxr-t 2 cups install 4096 Dec  1 17:21 /usr/share/cups/model
drwxrwxr-t 2 cups install 4096 Dec  1 17:28 /usr/share/cups/ppdc
drwxrwxr-t 2 cups install 4096 Dec  1 17:26 /usr/share/cups/usb

私はfindが再帰的であることを知っていますが、execコマンドに従う必要があり、ディレクトリの長い形式だけを印刷する必要があります。

for (( i=0; i<${#a[@]}; i++ )); do
#    for file in ${a[@]}; do
 find ${a[i]} -user $userid -group install -type f -exec ls -l {} \;
 find ${a[i]} -user $userid -group install -type d -exec ls -ld {} \;
done

同じ結果を提供します。

答え1

find $file -type d -user $userid -group install -exec ls -ld {} \;

これは で繰り返され、$file内部ls -ldのすべてのディレクトリで実行されます。したがって、繰り返しリストにサブディレクトリも含まれている場合は、そのサブディレクトリを再インポートします。まず、プライマリディレクトリからfind再帰的に起動し、毎回サブディレクトリを一覧表示します。

比較する:

$ mkdir -p dir1/subdir
$ for f in dir1 dir1/subdir ; do find "$f" -type d -exec ls -1d {} \; ; done
dir1
dir1/subdir
dir1/subdir

ここで何をしたいのか分かりません。現在処理中のファイルのリストのみをリストするだけです。$fileまったくそうする必要はありません。ただしなければなりません。ただし、特定のユーザーが所有するファイルのみを印刷する場合は、再帰を防ぐために使用できます。絶対にしないでください。findls -ld $filefind-maxdepth 0find

$ for f in dir1 dir1/subdir ; do find "$f" -maxdepth 0 -type d -exec ls -1d {} \; ; done
dir1
dir1/subdir

/usr/share/cupsしかし、すべてのファイルを含む/-iesディレクトリを見つけて、そのディレクトリで実行する方が良いかどうか疑問に思いましたfind -user ... -group ... -exec ls -ld {} +


の場合、a割り当てはa=$( < $tmpfile)文字列をに割り当てますa。 shell と同じでa[0]、スカラーはある意味では単一要素配列なので${#a[@]}返されます。1実際の配列にするには割り当てが必要ですa=( $(< $tmpfile) )が、空白の分割がより早く発生します。

代わりに読み取り入力ファイルを使用することもできますwhile read ...。バラよりバッシュFAQ 001

関連情報