Linux でスペースと特殊文字を含むファイル名を操作する方法
私たちはファイルやフォルダーの名前を頻繁に目にします。ほとんどの場合、ファイル/フォルダー名はファイル/フォルダーの内容に関連しており、数字と文字で始まります。英数字のファイル名は非常に一般的で広く使用されていますが、特殊文字を含むファイル/フォルダー名を処理する必要がある場合は当てはまりません。
注: 任意のタイプのファイルを使用できますが、簡略化して実装を容易にするために、テキスト ファイル (.txt) を扱います。記事全体を通して。
最も一般的なファイル名の例は次のとおりです。
abc.txt avi.txt debian.txt ...
数値ファイル名の例は次のとおりです。
121.txt 3221.txt 674659.txt ...
英数字のファイル名の例は次のとおりです。
eg84235.txt 3kf43nl2.txt 2323ddw.txt ...
特殊文字を含む、あまり一般的ではないファイル名の例:
#232.txt #bkf.txt #bjsd3469.txt #121nkfd.txt -2232.txt -fbjdew.txt -gi32kj.txt --321.txt --bk34.txt ...
ここで最も明白な疑問の 1 つは、ハッシュ (#)
、セミコロン (;)
、ダッシュ (-)
またはその他の特殊文字。
このようなファイル名は一般的ではありませんが、そのようなファイル名を処理する必要がある場合にシェルが壊れたり諦めたりすべきではないことに同意します。また、技術的に言えば、フォルダー、ドライバー、その他のものはすべて、Linux ではファイルとして扱われます。
名前にダッシュ (-) が含まれるファイルの処理
ダッシュ (-)
で始まるファイル、たとえば -abx.txt を作成します。
$ touch -abc.txt
サンプル出力
touch: invalid option -- 'b' Try 'touch --help' for more information.
上記のエラーの理由は、シェルがダッシュ (-)
の後のすべてをオプションとして解釈し、明らかにそのようなオプションがないため、エラーが発生することです。
このようなエラーを解決するには、特殊文字 (ここではダッシュ) 以降をオプションとして解釈しないように Bash シェルに指示する必要があります (はい、これとこの記事の他のほとんどの例はBASH 用です)。
このエラーを解決するには、次の 2 つの方法があります。
$ touch -- -abc.txt [Option #1] $ touch ./-abc.txt [Option #2]
長いリストの場合はコマンド ls または ls -l を実行することで、上記の両方の方法で作成されたファイルを検証できます。
$ ls -l total 0 -rw-r--r-- 1 avi avi 0 Jun 8 11:05 -abc.txt
上記のファイルを編集するには、次のようにします。
$ nano -- -abc.txt or $ nano ./-abc.txt
注: nano を、次のように vim という任意の他のエディタに置き換えることができます。
$ vim -- -abc.txt or $ vim ./-abc.txt
同様に、そのようなファイルを移動するには、次のようにする必要があります。
$ mv -- -abc.txt -a.txt or $ mv -- -a.txt -abc.txt
このファイルを削除するには、次の手順を実行する必要があります。
$ rm -- -abc.txt or $ rm ./-abc.txt
名前にダッシュが含まれるフォルダー内に多数のファイルがあり、それらをすべて一度に削除したい場合は、次のように実行します。
$ rm ./-*
1. ファイル名に含まれるハイフンの数とその出現箇所には、上で説明したのと同じルールが適用されます。つまり、-a-b-c.txt、ab-c.txt、abc-.txtなど。
2. フォルダーを削除するには 'rm -rf を使用する必要があるという点を除き、任意の数のハイフンを含むフォルダー名とその出現について、上で説明したのと同じルールが適用されます。 ' として:
$ rm -rf -- -abc or $ rm -rf ./-abc
名前にハッシュ(#)が含まれるファイルの扱い
記号 #
は、BASH ではまったく異なる意味を持ちます。 #
以降はすべてコメントとして解釈されるため、BASH では無視されます。
ファイル#abc.txtを作成します。
$ touch #abc.txt
サンプル出力
touch: missing file operand Try 'touch --help' for more information.
上記のエラーの理由は、Bash が #abc.txt をコメントとして解釈し、無視しているためです。したがって、コマンド touch はファイルオペランドなしで渡されたため、エラーが発生します。
このようなエラーを解決するには、BASH に # をコメントとして解釈しないよう要求できます。
$ touch ./#abc.txt or $ touch '#abc.txt'
そして、作成したばかりのファイルが次のようになることを確認します。
$ ls -l total 0 -rw-r--r-- 1 avi avi 0 Jun 8 12:14 #abc.txt
ここで、先頭以外の場所に #
が含まれる名前のファイルを作成します。
$ touch ./a#bc.txt $ touch ./abc#.txt or $ touch 'a#bc.txt' $ touch 'abc#.txt'
「ls -l」を実行して確認します。
$ ls -l total 0 -rw-r--r-- 1 avi avi 0 Jun 8 12:16 a#bc.txt -rw-r--r-- 1 avi avi 0 Jun 8 12:16 abc#.txt
2 つのファイル (a と #bc など) を一度に作成するとどうなるか:
$ touch a.txt #bc.txt
作成したばかりのファイルを確認します。
$ ls -l total 0 -rw-r--r-- 1 avi avi 0 Jun 8 12:18 a.txt
上記の例から明らかなように、ファイル ‘a’ のみが作成され、ファイル ‘#bc’ は無視されています。上記の状況を正常に実行するには、次のことを行うことができます。
$ touch a.txt ./#bc.txt or $ touch a.txt '#bc.txt'
そしてそれを次のように検証します。
$ ls -l total 0 -rw-r--r-- 1 avi avi 0 Jun 8 12:20 a.txt -rw-r--r-- 1 avi avi 0 Jun 8 12:20 #bc.txt
ファイルは次のように移動できます。
$ mv ./#bc.txt ./#cd.txt or $ mv '#bc.txt' '#cd.txt'
次のようにコピーします。
$ cp ./#cd.txt ./#de.txt or $ cp '#cd.txt' '#de.txt'
次のように選択したエディタを使用して編集できます。
$ vi ./#cd.txt or $ vi '#cd.txt'
$ nano ./#cd.txt or $ nano '#cd.txt'
そして、次のように削除します。
$ rm ./#bc.txt or $ rm '#bc.txt'
ファイル名にハッシュ (#) が含まれるすべてのファイルを削除するには、次のコマンドを使用します。
# rm ./#*
名前にセミコロン (;) が含まれるファイルの処理
ご存知ない方のために付け加えておきますが、セミコロンは BASH だけでなく、おそらく他のシェルでもコマンド区切り文字として機能します。セミコロンを使用すると、複数のコマンドを一度に実行でき、区切り文字として機能します。セミコロンが含まれるファイル名を扱ったことがありますか?ここにいない場合は、そうします。
セミコロンを含むファイルを作成します。
$ touch ;abc.txt
サンプル出力
touch: missing file operand Try 'touch --help' for more information. bash: abc.txt: command not found
上記のエラーの理由は、上記のコマンドを実行すると、BASH がタッチをコマンドとして解釈しますが、セミコロンの前にファイル オペランドが見つからず、エラーが報告されるためです。また、「abc.txt」コマンドが見つからないという別のエラーも報告します。これは、セミコロンの後に BASH が別のコマンドを予期しており、「abc.txt」がコマンドではないためです。
このようなエラーを解決するには、次のように BASH にセミコロンをコマンド区切り文字として解釈しないように指示します。
$ touch ./';abc.txt' or $ touch ';abc.txt'
注: ファイル名を一重引用符 で囲みました。これは、
;
がコマンド区切り文字ではなくファイル名の一部であることを BASH に伝えます。
名前にセミコロンが含まれているファイルおよびフォルダーに対する残りのアクション (つまり、コピー、移動、削除) は、名前を一重引用符で囲むことで直接実行できます。
ファイル/フォルダー名のその他の特殊文字の処理
ファイル名のプラス記号 (+)
特別なことは必要ありません。以下に示すように単純なファイル名を付けて、通常どおりに実行してください。
$ touch +12.txt
ファイル名にドル記号 ($)
セミコロンの場合と同様に、ファイル名を一重引用符で囲む必要があります。残りのことは簡単です。
$ touch '$12.txt'
ファイル名のパーセント (%)
何も特別に行う必要はなく、通常のファイルとして扱います。
$ touch %12.txt
ファイル名にアスタリスク (*)
ファイル名にアスタリスクがあっても何も変更されず、通常のファイルとして引き続き使用できます。
$ touch *12.txt
注: *
で始まるファイルを削除する必要がある場合は、次のコマンドを使用してそのようなファイルを削除しないでください。
$ rm * or $ rm -rf *
代わりに、
$ rm ./*.txt
ファイル名の感嘆符 (!)
ファイル名を一重引用符で囲むだけで、残りの部分は同じです。
$ touch '!12.txt'
ファイル名のアットマーク (@)
余分なことは何もせず、アットマークを持つファイル名を非正規ファイルとして扱います。
$ touch '@12.txt'
ファイル名に ^
特別な注意は必要ありません。ファイル名に ^
が含まれるファイルを通常のファイルとして使用します。
$ touch ^12.txt
ファイル名のアンパサンド (&)
ファイル名を一重引用符で囲めば、準備完了です。
$ touch '&12.txt'
ファイル名の括弧()
ファイル名に括弧が含まれている場合は、ファイル名を一重引用符で囲む必要があります。
$ touch '(12.txt)'
ファイル名の中括弧 {}
特別なケアは必要ありません。単なる別のファイルとして扱ってください。
$ touch {12.txt}
ファイル名の山形
山形の付いたファイル名は一重引用符で囲む必要があります。
$ touch '<12.txt>'
ファイル名内の角括弧 [ ]
角括弧が含まれるファイル名は通常のファイルとして扱うため、特別な注意を払う必要はありません。
$ touch [12.txt]
ファイル名のスコア (_) の下
これらは非常に一般的であり、追加のものは何も必要ありません。通常のファイルで行うことと同じことを行うだけです。
$ touch _12.txt
ファイル名に等しい (=)
等号を付けても何も変更されないため、通常のファイルとして使用できます。
$ touch =12.txt
バックスラッシュ(\)の扱い
バックスラッシュはシェルに次の文字を無視するように指示します。セミコロンの場合と同様に、ファイル名を一重引用符で囲む必要があります。残りのことは簡単です。
$ touch '.txt'
フォワードスラッシュの特殊なケース
ファイル システムにバグが発生するまで、名前にスラッシュ (/)
が含まれるファイルを作成することはできません。スラッシュを回避する方法はありません。
したがって、'/12.txt' や 'b/c.txt' などのファイルを作成できる場合は、ファイル システムにバグがあるか、Unicode がサポートされているかのどちらかです。これにより、スラッシュを含むファイルを作成できます。この場合、スラッシュは実際のスラッシュではなく、スラッシュに似た Unicode 文字です。
ファイル名に疑問符 (?)
繰り返しますが、特別な試みを行う必要がない例です。疑問符が付いたファイル名は、最も一般的な方法で扱うことができます。
$ touch ?12.txt
ファイル名のドットマーク(.)
ドット (.)
で始まるファイルは Linux では非常に特殊であり、ドット ファイルと呼ばれます。これらは隠しファイルであり、通常は設定ファイルまたはシステム ファイルです。このようなファイルを表示するには、ls コマンドでスイッチ「-a」または「-A」を使用する必要があります。
このようなファイルの作成、編集、名前変更、削除は簡単です。
$ touch .12.txt
注: Linux では、ファイル名に必要な数のドット (.)
を含めることができます。他のシステムとは異なり、ファイル名のドットは名前と拡張子を区切ることを意味しません。複数のドットを含むファイルは次のように作成できます。
$ touch 1.2.3.4.5.6.7.8.9.10.txt
そしてそれを次のようにチェックしてください:
$ ls -l total 0 -rw-r--r-- 1 avi avi 0 Jun 8 14:32 1.2.3.4.5.6.7.8.9.10.txt
ファイル名のカンマ(,)
ファイル名にはカンマをいくつでも含めることができ、余分なものは必要ありません。単純なファイル名として通常の方法で実行してください。
$ touch ,12.txt or $ touch ,12,.txt
ファイル名のコロン (:)
ファイル名にはコロンをいくつでも含めることができ、余分なものは必要ありません。単純なファイル名として通常の方法で実行してください。
$ touch :12.txt or $ touch :12:.txt
ファイル名に引用符 (単一および二重) が含まれている
ファイル名に引用符を含めるには、交換規則を使用する必要があります。つまり、ファイル名に一重引用符が必要な場合はファイル名を二重引用符で囲み、ファイル名に二重引用符が必要な場合は一重引用符で囲みます。
$ touch "15'.txt" and $ touch '15”.txt'
ファイル名のチルダ (~)
emacs などの Linux の一部のエディタは、編集中のファイルのバックアップ ファイルを作成します。バックアップ ファイルには、元のファイルの名前にファイル名の末尾にチルダを加えた名前が付けられます。次のようにするだけで、名前にチルダが含まれるファイルを任意の場所に置くことができます。
$ touch ~1a.txt or $touch 2b~.txt
ファイル名の空白
「こんにちは、私の名前は avishek.txt」というように、文字と単語の間にスペースを入れた名前のファイルを作成します。
ファイル名にスペースを含めるのは得策ではありません。読みやすい名前を区別する必要がある場合は、アンダースコアまたはダッシュを使用する必要があります。ただし、そのようなファイルを作成する必要がある場合は、次の文字を無視するバックスラッシュを使用する必要があります。上記のファイルを作成するには、次のようにする必要があります。
$ touch hi\ my\ name\ is\ avishek.txt hi my name is avishek.txt
私はあなたが遭遇する可能性のあるすべてのシナリオをカバーしようとしました。上記の実装のほとんどは明示的に BASH シェル用であり、他のシェルでは動作しない可能性があります。
何かを見逃したと思われる場合は (これは非常に一般的なことであり、人間の性質です)、以下のコメントにあなたの提案を含めることができます。つながりを保ち、コメントし続けましょう。引き続きご期待ください。 「いいね!」とシェアして拡散にご協力ください!