find .
項目タイプ(ディレクトリ/ファイル)を表示するには?実際、エントリがファイルか空のディレクトリであるかはわかりません。
答え1
GNUバージョンには、さまざまなファイルメタデータを印刷するfind
オプションがあります。-printf
例えば、
find . -printf "%y %p\n"
ファイルタイプ(通常のファイルの場合はf、ディレクトリの場合はd)とその名前を印刷します。
LinuxディストリビューションはGNUバージョンを配布する傾向がありますfind
。 GNUがない場合は、find
小さなスクリプトが必要な場合があります。
find . -exec sh -c 'ls -l "$1" | cut -c1' sh-find "{}" \; -print
(やや醜い出力を改善することは、読者の練習問題として残します)。
答え2
このls
コマンドには、ディレクトリの後ろ、実行可能ファイルの後、シンボリックリンクの後、名前付きパイプの後に1つを追加するための標準オプションがあります-F
(そして、実装時により多くのシンボルを追加できます。マニュアルを参照)。/
*
@
|
ls
ls -F
見つかった各項目を呼び出します。
find . -exec ls -1 -f -d -F {} +
-1
結果を単一の列にインポートし、結果の並べ-f
替えをオフにして(find
パス名を見つける順序を取得し)、コンテンツの代わりにディレクトリを一覧-d
表示する(「ダッシュ - 円」)オプションを追加しました。
一度に呼び出すことができるだけ、一括して{} +
見つかったパス名に置き換えられます。ls
例を実行してください:
$ find . -exec ls -1 -f -d -F {} +
./
./.bash_profile
./.zshrc
./.bashrc
./.yashrc
./dir1/
./dir1/file-1
./dir1/subdir/
./dir1/subdir/file-2
./dir2/
./dir2/file-1
./dir2/subdir/
./dir2/subdir/file-2
特定の文字で終わらないパス名は通常のファイルです。
答え3
次のコマンドは似ていますfind .
が、ディレクトリタイプファイルに末尾のスラッシュを追加します。
find . ! -type d -print -o -exec printf '%s/\n' {} \;
アイデアはディレクトリを表すことですそしてそれでも出力に有効な既存のパス名が表示されます。
メモ:
このコマンドは移植可能です。
で終わるパス名を使用すると
.
(ディレクトリが存在する場合)、パス名が処理されたときに指定された文字列が代わりに置き換えられます。実際に。/
find
{}
//
/
ルートディレクトリを指定して正しくインポートしない限り、これは問題ではありません。//
。回避策は代わりにを/.
指定することです/
。改善点は、末尾のスラッシュがすでに存在する場合は追加しないことです。find … \( ! -type d -o -path '*/' \) -print -o -exec printf '%s/\n' {} \;
ここでは、
…
1つ以上のfind
開始パス名(またはそれが正しい場合は0)を表します。その後、安全に指定できます/
。