Unix 検索結果のカスタム区切り記号

Unix 検索結果のカスタム区切り記号

findいくつかのファイルを見つけて、すべてのファイルをファイル間にカスタム区切り文字を含む単一行(改行なし)として返すために使用したいと思います。

たとえば、3つのファイルの結果は次のようになります。

/my/file/1::/my/file/2::/my/file/3

変える

/my/file/1
/my/file/2
/my/file/3

標準のUnixツールを組み合わせてこれを達成する方法はありますかfind

答え1

findとのGNU実装では、次のことがsedできます。

find . -type f -printf '%p::' | sed '$s/::$/\n/'
  • -printfGNUの述語は、findで区切られた1行でファイル名を印刷し、最後の行の::最後sedの行(ここでは制限なし)を改行文字に置き換えます。::

例:

$ find . -type f -printf '%p\n'
./foo
./test file
whose name
contains newline characters and ::
./bar

$ find . -type f -printf '%p::' | sed '$s/::$/\n/'
./foo::./test file
whose name
contains newline characters and ::::./bar

-printf '%p::'is と同等の標準です。 POSIXはテキスト以外のものを処理できないため、-exec printf '%s::' {} +このGNUsed式には同等のものはありません。sed

答え2

そしてzsh

(){ print -r -- ${(j[::])argv}; } /my/**/*(N.)

下に隠されていないすべての一般ファイルを見つけてそのパスを/my/印刷するには(語彙的に並べ替えられていますが、代替の並べ替え順序については、修飾子を参照してください)no使用してください。Oj::

答え3

-printf は多くの find 実装では見つかりません。この場合、この-execコマンドを使用して同じ目的を達成できます。

find "/some/dir" -exec echo -n {}"|" \;

echo各ディレクトリエントリの印刷

-n改行文字の印刷を防止する修飾子

この"|"文字は各項目の後に追加されます。

エコ実装がこのフラグを-nサポートしていない場合は簡単です。

find "/some/dir" -exec printf "%s" {}"|" \;

上記は、OpenWRTやVMWare ESXiなどの最小ファームウェア指向ディストリビューションにあるbusyboxを含む、ほとんどすべてのbashシェルで動作します。

(*)最後の例のprintf呼び出しは、最初の回答で提案された照会オプションではなく、外部照会です。 printfは、考えられるほとんどすべてのディストリビューション、さらには最小のディストリビューションでもバイナリとして存在します。

関連情報