`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

の使用は、-printfGNU ( Linux システムでfind最も一般的な実装) を前提としています。find

答え2

2回検索:

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

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

名前テストに使用されるパターンの引用符にも注意してください。引用符がない場合、シェルは を呼び出す前に、現在のディレクトリ内の名前に対して文字列を一致させようとしますfind。シェルfailglobでシェル オプションが設定されている場合bash、またはNOMATCHのシェル オプションがzsh設定されていない場合、何にも一致しない引用符なしのグロブ パターンはシェルからエラーを生成し、findまったく呼び出されません。


あるいは、ディレクトリ パス名の末尾にスラッシュを出力するだけです (これは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


もう 1 つの方法は、実際に を使用して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 コマンドへのパイプ処理に適した形式でもあります。

関連情報