![「find -print0」の使用にはどのような問題がありますか? [閉鎖]](https://linux33.com/image/148743/%E3%80%8Cfind%20-print0%E3%80%8D%E3%81%AE%E4%BD%BF%E7%94%A8%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
私はこの実験(Bashで)のために混乱しました。
$ mkdir 'foo\n'
$ find . -print0 | od -c
0000000 . \0 . / f o o \ n \0
0000012
ご覧のとおり、「find」はnull文字を正しく使用して出力を区別しますが、バックスラッシュ「n」を使用してディレクトリ名の改行を「foo \ n」にエスケープします。なぜこのようなことをするのですか? 「-print0」と言いましたが、「これを行うと、改行文字を含むファイル名が検索出力を処理するプログラムで正しく解釈されるようになります。」代わりに "\0" が区切り文字なので、エスケープ処理は必要ありません。 \N"。
答え1
問題はではなく、find
このディレクトリを作成する方法です。一重引用符で囲まれた文字列は'foo\n'
実際には5文字の文字列であり、最後の2文字はバックスラッシュと小文字の「n」です。
二重引用符も役に立ちません。なぜなら、シェルで二重引用符で囲まれた文字列はバックスラッシュをエスケープ文字として使用しますが、実際にはCスタイルのバックスラッシュシーケンスを解釈しないからです。
bashやzsh(Debian / Ubuntuではdashではない)などのシェルでは、$'...'
次のシーケンスを解釈することができます。
$ mkdir $'foo\n'
(バッシュリファレンス文書この機能を「ANSI C引用」といいます。
Bourneシェル互換シェルで動作するもう1つのオプションは、次のものを挿入することです。実際新しいチーム:
$ mkdir 'foo
'
Returnこれは最初の行の末尾にある実際の値であり、2行目には閉じる単一引用符のみがあります。
答え2
新しい行を追加して名前付きディレクトリを作成しましょうfoo
。
$ mkdir $'foo\n'
次に find を試してみましょう:
$ find . -print0 | od -c
0000000 . \0 . / f o o \n \0
0000011
\n
脱出口はありません。
問題は、名前の後に続くと解釈されることmkdir 'foo\n'
です。これでこれを確認できます。foo
\
n
$ printf '%s' 'foo\n' | od -c
0000000 f o o \ n
0000005