以下のように、それぞれの絶対パスを使用してフォルダ内のすべてのファイルを1行ずつ一覧表示したいと思います。
filename1 /home/.../file1
filename2 /home/.../file2
filename3 /home/.../file3
試しましたが、find $(pwd) -type f
パスのみを提供します。
答え1
GNUの使用find
:
find "$PWD" -type f -printf '%f %h/%f\n'
%f
すべての先行ディレクトリファイル名を削除します(最後の要素のみ)。%h
ファイル名の先行ディレクトリ(最後の要素を除くすべての要素)ファイル名にスラッシュが含まれていない場合(現在のディレクトリにあるため)、%h指定子は「.」に展開されます。
答え2
標準find
:
find "$PWD" -type f -exec sh -c '
for pathname do
printf "%s\t%s\n" "${pathname##*/}" "$pathname"
done' sh {} +
これにより、現在のディレクトリ内または下にあるすべてのファイルがタブ区切りリストが印刷されます。最初の列にはファイルのファイル名が含まれ、2番目の列には現在のディレクトリ$PWD
(検索パスの絶対パス)に基づくファイルのパス名が含まれています。
これは、見つかったパス名を好む形式で単純に名前を出力する短いインラインスクリプトに一括供給することによって行われます。パラメータ置換は${pathname##*/}
その値に拡張され、$pathname
最後の値より前のすべてのエントリが削除されます/
。
改行文字を含むファイル名は複数行に表示され、タブを含むファイル名を正しく区別することは困難です。結果が解析ではなく表示用であると仮定すると、おそらく大丈夫でしょう。
答え3
こんにちは、ありがとう言及するfselect
!
奇妙なファイル名の問題は新しいものではないようです。ファイル名とパスが同じ行にある(それに含まれているかどうか)さえわかりません\n
。これらの問題を解決するには、fselect
サポートINTO
オプション。
最も簡単なバリエーションはINTO LIST
追加の解析用ですxargs
。INTO JSON
より洗練された処理に興味があるかもしれません。
答え4
そしてzsh
:
for f (**/*(DN)) print -r -- $f $f:P
$f:P
realpath()
ファイルへの標準絶対パスへの拡張と同じです(パスコンポーネントのすべてのシンボリックリンクをターゲットに繰り返し拡張)。