
印刷するスペース(引用符のペア)をfind
含む検索結果を含める方法。''
この結果にスペースが含まれている場合にのみ、パス文字列にスペースが含まれていない場合はそのままにしてください。
答え1
find
あなたのバージョンが-printfをサポートしている場合は、次の方法を使用してこれを実行できます。
find . -name "* *" -printf "\"%p\"\n" -o -print
答え2
GNUツールを使用してCSV出力を生成するとします。
find . -print0 |
LC_ALL=C sed -z '/[",[:space:]]/{s/"/""/g; s/.*/"&"/}' |
tr '\0' '\n'
つまり、ファイル名に1つ以上の"
、またはASCIIスペース文字(SPC、TAB、CR、およびCSVのすべての特殊改行文字が含まれますが、これらに限定されません)が含まれている場合は、次のように,
変換されます。 escape s )) 文字列を二重引用符で囲みます。"
""
"
この部分は、NULをレコード区切り記号として使用することによって行われる。 NULはファイルパスには存在できない唯一のバイトであるためです。次にNULを改行文字に変換しますtr
。
GNU以外のシステムでは、いつでも次のものを使用できますperl
。
find . -print0 | perl -l -0 -pe 'if (/[",\s]/) {s/"/""/g; $_ = "\"$_\""}'
後ろに
touch 'a b' $'a\nb' a,b a_b $'a\200b' 'a"b'
彼らは以下を提供します:
.
"./a""b"
./a_b
"./a,b"
./a�b
"./a
b"
"./a b"
(�
私の端末は、\200
有効な文字を形成しないバイトが再生されるUTF-8ロケールにあります。)
除外し.
て./
プレフィックスを指定するには(GNU固有のものですが)-print0
に置き換えます。これは作る:-mindepth 1 -printf '%P\0'
-printf
"a""b"
a_b
"a,b"
a�b
"a
b"
"a b"
-print0
また、-mindepth
GNU拡張ですが、それ以降、いくつかの他の実装にコピーされました。あなたの実装がまだ実装されていないいくつかの実装の1つである場合は、次のものを置き換えることができます。
find . -print0
そしてfind . -exec printf '%s\0' {} +
find . -mindepth 1 -printf '%P\0'
そしてfind . ! -name . -exec sh -c 'for i do printf "%s\0" "${i#./}"; done' sh {} +
答え3
出力を次にパイプするだけですawk
。
find . | awk '/ /{ printf"\"%s\"\n", $0; next } { print }'