ファイル名と絶対パスを1行で取得するには?

ファイル名と絶対パスを1行で取得するには?

以下のように、それぞれの絶対パスを使用してフォルダ内のすべてのファイルを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追加の解析用ですxargsINTO JSONより洗練された処理に興味があるかもしれません。

答え4

そしてzsh

for f (**/*(DN)) print -r -- $f $f:P

$f:Prealpath()ファイルへの標準絶対パスへの拡張と同じです(パスコンポーネントのすべてのシンボリックリンクをターゲットに繰り返し拡張)。

関連情報