可能な限り多くの
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
とスペース?
/
ほとんどの linux/unix システムでは有効なファイル名またはディレクトリ名の文字ではないと思いますか? これまでのところ、、、、(スペース文字)とファイル名に問題がありました!
。;
|
'
可能な限り多くの
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
とスペース?
/
ほとんどの linux/unix システムでは有効なファイル名またはディレクトリ名の文字ではないと思いますか? これまでのところ、、、、(スペース文字)とファイル名に問題がありました!
。;
|
'
/
null-byte と同様に、あなたは正しいです\0
。その制限を回避する方法はありません (ファイル システムのハッキングを除く)。
\n
改行やタブなどの驚くべき文字を含め、他のすべての文字をファイル名に使用できます\t
。シェルが特殊文字として認識しないように入力する方法は多数あります。実用的なアプローチだけを示します。
単一引用符を使用してそれらを引用することにより、ほとんどの印刷可能な文字を入力できます。'
date > 'foo!bar["#$%&()*+,-.:;<=>?@[\]^_`{|}~'
もちろん、この方法で一重引用符を入力することはできませんが、そのために二重引用符を使用できます"
。
date > "foo'bar"
両方が必要な場合は、一方の引用を終了して別の引用を開始できます。
date > "foo'bar"'"bloh'
\
または、バックスラッシュを使用して特殊文字を直接エスケープすることもできます。
date > foo\"bar
バックスラッシュは、二重引用符内ではエスケーパーとしても機能しますが、単一引用符内ではそのようには機能しません (特別な意味のない単純な文字です)。
改行などの印刷できない文字を入力する必要がある場合は、ドルとシングルクォーテーションの表記法を使用できます。
date > $'foo\nbar'
これは bash では有効ですが、他のすべてのシェルでは必ずしも有効ではありません。だから気をつけて!
最後に、変数を使用して奇妙な名前を保持することは理にかなっています (直接スペルアウトする必要がないように:
strangeName=$(xxd -r <<< "00 41 42 43 ff 45 46")
date > "$strangeName"
このようにして、シェルコードを読みやすく保つことができます。
しかし、多くのスクリプトはそのようなファイルを適切に処理できないため、一般に、ファイル名にそのような文字を使用することはお勧めできません。
スクリプトを簡単に書くことは簡単ではありません。最も基本的なルールは、二重引用符で引用変数を使用することです。
for i in *
do
cat "$i" | wc -l
done
これにより、遭遇する可能性が高い問題の 99% が解決されます。
find
特殊文字を含む可能性のあるディレクトリ エントリを検索するためにを使用している場合は、 を使用printf0
して、スペースではなくヌル バイトで出力を区切る必要があります。多くの場合、他のプログラムxargs
は、ヌルバイトで区切られたファイル名のリストを理解できます。
ファイル名がダッシュ-
で始まる場合、オプションと間違えられることがよくあります。一部のプログラムでは、特別なオプション--
を指定して、後続のすべての引数がオプションではないことを示すことができます。より一般的なアプローチは、ダッシュで始まらない名前を使用することです。
for i in *
do
cat ./"$i" | wc -l
done
このように、という名前のファイル-n
は実行されませんcat -n
が、に指定cat ./-n
されたオプションとしては理解されません(これは「行数」を意味します)。-n
cat