たとえば、あるディレクトリ内のファイルとディレクトリを検索します。
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
の使用は、-printf
GNU ( 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 コマンドへのパイプ処理に適した形式でもあります。