「find」コマンドの出力にディレクトリを表示するには?

「find」コマンドの出力にディレクトリを表示するには?

たとえば、ディレクトリ内のファイルとディレクトリを探しています。

ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$ 

上記の出力でディレクトリをどのように表示できますか./archive/example.com./live/example.com

答え1

ファイルの種類と名前を印刷するには、次のコマンドを使用します-printf "%y %p\n"

$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com

GNUが想定されています(-printfLinuxシステムでfind最も一般的な実装)。find

答え2

ダブル検索:

echo 'directories'
find . -name 'example.com*'   -type d

echo 'non-directories'
find . -name 'example.com*' ! -type d

また、名前テストに使用されたパターンへの参照も参照してください。引用符がない場合、シェルはを呼び出す前に文字列を現在のディレクトリの名前と一致させようとしますfindfailglobシェルオプションがシェルに設定されているbash場合、またはシェルオプションがアンセットされていない場合、何も一致しない引用符のないワイルドカードパターンはシェルでエラーを生成し、まったく呼び出されません。NOMATCHzshfind


または、ディレクトリパス名の末尾にスラッシュを出力します(ls -pディレクトリの表示方法)。

find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)

上記findのコマンドは、まず名前が正しいことをテストします。そうであれば、ディレクトリであり、printf後にスラッシュが付いた出力ディレクトリのパス名を呼び出します。ディレクトリでない場合は、-printパス名をそのまま出力するために使用されます。

GNUの場合、findこの-exec printf '%s/\n' {} \;ビットは-printf '%p/\n'

標準を使用すると、外部ユーティリティの呼び出しはfindできるだけ少なくなりますが、これはディレクトリがおそらく最後に出力されるか、少なくとも一括出力されることを意味します。-exec printf '%s/\n' {} +printf


別のオプションは、実際にls -pディレクトリを他のファイル形式と区別するために使用することです。を使用すると、上記と同様にディレクトリls -pが末尾の文字とともに一覧表示されます。/

find . -name 'example.com*' -exec ls -f -d -p {} +

出力の並べ替えを-f避け、リストを避けるためにここを使用しています。ls-dコンテンツ目次。

また入れるls -F代わりにls -pその他ディレクトリ以外のファイル形式を表示します。たとえば、実行可能ファイルにはサフィックスが続き、*シンボリックリンクにはサフィックスが付きます@

および-p-Fおよび-f)は-dどちらもこのユーティリティの標準オプションですls

答え3

次のように使用できますfile

sudo find . -name "example.com*" -print0 | xargs  -0 sudo file

出力例:

$ sudo find .  -name "example.com*"   -print0 | xargs  -0 sudo file
./example.com. big file: ASCII text
./example.com-dir:       directory
./example.com:           empty

答え4

gnuオプションなしで* nixバージョンで使用できるより移植性の高いオプション(macOSなど)が必要な場合は、-printf次のようにディレクトリパスの末尾にスラッシュを追加できます。ls

find . -name "example.com*" -exec ls -dF {} \;

例:

$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/

これは、より多くのUNIXコマンドの追加パイプに適した形式でもあります。

関連情報