Unixでピリオドを含むファイルを許可するのはなぜですか?最後に名前?これは便利ですか?
たとえば、
filename.
ファイル拡張子をエコーする簡単な機能があるので、これを尋ねます。
ext() {
echo ${1##*.}
}
しかし、ファイル名がで終わると何も印刷されないことがわかっているので、.
次のように書くことがより信頼できるかどうか疑問に思います。
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
明らかに達成しようとしている作業によって異なりますが、.
ファイル名の末尾に追加することが許可されていない場合は、最初にそれについて何も知りたくありません。
答え1
Unixファイル名ただ一連のバイトで、/
任意の場所で合計を除くすべてのバイトを含めることができます。NUL
Windowsやそのファイルシステムなどの組み込みの「拡張子」の概念がないため、ファイル名が通常表示される文字で終わったり起動したりすることを許可しない理由はありませ.
んx
。
Unixでファイル名の末尾にピリオドを許可するのはなぜですか? 「バイトシーケンス」は、何かを計算する必要がある動機付けの理由がない場合に実際に計算する理由がない場合の単純で非排他的な名前定義です。特定のコンテンツを具体的に除外するルールを開発して適用するには、より多くの作業が必要です。
どの目的に使用されますか?もちろん、その名前でファイルを生成できます。で終わるファイル名を使用できますかx
?通常.
、aで終わるファイル名を生成するとは言えませんが、両方とも明らかに次の一部.
です。x
移植可能なファイル名文字セットこれは普遍的にサポートされなければならず、どちらにも特別なものがないので、それを使用する必要がある場合(おそらくマシン生成エンコーディングを使用して)、それを行うことができ、動作すると信じられます。
.
また、現在のディレクトリと親ディレクトリを参照する特殊ファイル名(ドット)と(ドットポイント)は次のとおりです。..
必須ファイル名を処理するすべてのコードは通常、.
これらの問題を解決する必要があります。
答え2
実際の質問は、なぜオペレーティングシステムが「.」を重視しているのかです。 ?これには技術的な理由はなく、確認せずにファイル形式を想定するのに役立つ標準にすぎません。
MP3ファイルの名前を.txtに変更してWindowsで開こうとすると、このアイデアに欠点がある理由をすぐに理解できます。突然ファイルを正しく「開くことができません」技術的には、速度などの要因を考慮せずに「最良の」アプローチは、ファイルで何をするかを決定する前にファイル形式を決定することです。拡張子は簡単に混乱し、問題を引き起こす可能性があるためです。
Linuxが名前のピリオドを気にしないのは、コンピュータ以外の人が気にしないのと同じ理由です。ピリオドと他の文字の間に本質的な違いはありません。ただし、一部のプログラムは対応するピリオドを表示するようにコード化されています。そしてそれを特別に扱いなさい。
実際には拡張機能だけが欲しいと仮定すると(2つのコードスニペットの機能ではない)、次のものを使用できます。
ext(){
extension=
[[ $1 =~ \. ]] && extension="${1##*.}"
echo "$1 -> ${extension:-No extension}"
}
ext something. # something. -> No extension
ext something.txt # something.txt -> txt
ext something # something -> No extension
ext som.thing.mp3 # som.thing.mp3 -> mp3
ext .whatever # .whatever -> whatever
*最後の内容を参考にしてください。
拡張子がない場合(コードのように)ファイル名自体を返したい場合は、長いSHスタイルの2番目のフラグメントを使用する理由はありません。あなたは次のように書きました:
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
これは実際には次のようになります。
ext(){
extension="${1##*.}"
# This line is what your first snippet is doing:
# echo "$extension"
# This line is what your second snippet is doing:
[[ $extension ]] && echo "$extension" || echo "$1"
}
これは実際には次のようになります。
# First snippet
ext(){
echo "${1##*.}"
}
# Second snippet
ext(){
extension="${1##*.}"
echo "${extension:-$1}"
}
ユーザーが基本的に何でも入力できることを当然のことではありません。実際にどのファイル形式があるかを確認するには、fileコマンドを使用してみてください。これは、ファイル形式を把握するためにファイル名を解析することがスキンを適用する唯一の方法ではないためです。 Linuxでは、単純なファイル名を使用することもできます。\