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/'
-printf
GNUの述語は、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/
印刷するには(語彙的に並べ替えられていますが、代替の並べ替え順序については、修飾子を参照してください)n
をo
使用してください。O
j
::
答え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は、考えられるほとんどすべてのディストリビューション、さらには最小のディストリビューションでもバイナリとして存在します。