名前に特殊文字を含むファイルまたはディレクトリを入力するにはどうすればよいですか?


44

ターミナルに次のフォルダーを入力します。

Milano, Torino (Jan)-Compressed

cdこのディレクトリに入るコマンドをどのように書くべきですか?

スペースなど、いくつかの他の特殊文字\*)(?原因の問題私は、コマンドラインまたはスクリプトでそれらを使用しよう、例えば:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token `newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

一般に、端末に特殊文字を含むファイルまたはディレクトリ名を入力するにはどうすればよいですか?


回答:


43

引数を区切るために通常スペースが使用されるため、このコマンドはあいまいです。cdは何をしたいのかわかりませんが、解決する方法は2つあります。

スペース(および他のすべての特殊文字)を「マスク」して、端末がスペースをセパレーターではなく文字として意味することを認識できるようにします。

cd Milano\,\ Torino\ \(Jan\)-Compressed

または、フォルダー名またはパスを引用符で囲みます

cd "Milano, Torino (Jan)-Compressed"

26

ちょっとしたヒント:タブ補完 ;-)

  1. たとえば、最初の文字cd Mi(または必要に応じて複数の文字)を入力し、を押しTabます。ターミナルは、残りの単語を完成させることであなたを助けます。

別の方法:ドラッグアンドドロップ

  1. ディレクトリが表示されていて、ターミナルを使用してアクセスする場合は、cd最初に入力してから、ディレクトリをターミナルにドラッグアンドドロップし、を押しますenter

24

次のように書きます:

cd 'Milano, Torino (Jan)-Compressed'

それ以外の場合はMilano,、フォルダー名として扱われます。これは、フォルダー名にスペースが含まれているために発生します。または、いくつかの特殊文字をエスケープします。

cd Milano\,\ Torino\ \(Jan\)-Compressed/

22

tl; dr:特殊文字を引用するには、バックスラッシュでエスケープする\か、二重" "引用符または単一引用符で囲みます' 'Tab ↹完了は適切な引用を処理します。


あなたが求めているのは引用です:

引用は、シェルに対して特定の文字または単語の特別な意味を削除するために使用されます。(…)3つの引用メカニズムがあります: エスケープ文字重引用二重引用符[からの引用man bash]

エスケープ文字で引用 \

引用符で囲まれていないバックスラッシュ(\)はエスケープ文字です。を除き、次の文字のリテラル値を保持します<newline>

そのため、特殊文字を使用してディレクトリまたはファイルを入力するには、次のように後者をエスケープします\。例:

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \\  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”

bashProgrammable Completion(別名Tab ↹Completion)は、エスケープ文字で特殊文字を自動的にエスケープします\

二重引用符で引用する " "

二重引用符で文字を囲むことを除いて、全ての文字のリテラル値を保持し$`\、および、履歴展開が有効になっている場合、!

そのため、特殊文字を使用してディレクトリまたはファイルを入力するには、ファイル名またはパスの少なくとも後者または大部分を二重引用符でエスケープします。例:

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

として$`および!二重引用符内でその特別な意味を維持するために、パラメーター拡張コマンド置換算術拡張、および履歴拡張が二重引用符で実行されます。

単一引用符で引用する ' '

文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。バックスラッシュが先行する場合でも、単一引用符は単一引用符の間に出現しない場合があります。

そのため、特殊文字を使用してディレクトリまたはファイルを入力するには、ファイル名またはパスの少なくとも後者または大部分を二重引用符でエスケープします。例:

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

あなたには引用の詳細を見つけることができますman bash/ QUOTINGに、wiki.bash-hackers.orgと上tldp.org


10

Cのような文字列と$ 'string'

とりわけ、$'...'クォートのタイプを使用して、前述の文字を含む\nおよびなどのANSI-Cバックスラッシュ文字\tを使用できます。bash 4.3マニュアルから:

$ 'string'という形式の単語は特別に扱われます。単語は文字列に展開され、ANSI C標準で指定されているように、バックスラッシュでエスケープされた文字が置き換えられます。

これは、ファイル名自体にシングル/ダブルクォートのミッシュマッシュなどが含まれる場合、改行やタブを含むファイル、特に複雑なawk行を書いているときに、シングルクォートとダブルクォートを区別するために異なる方法を使用する必要がある場合に特に便利です。

たとえば、そのようなファイルを作成してリストする:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

次のような文字の16進値を使用できます。

$ touch 'file(name'
$ ls file$'\x28'name
file(name

printf

前と同じアイデア-エスケープ文字を利用します。

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

iノードを使用します。

すべてのファイルまたはディレクトリには、iノードと呼ばれる特定の10進数で参照される特別なデータ構造が関連付けられています。したがってfind、コマンドを使用して特定のiノードを使用して間接的にファイルを検索し、それを使用して何かを実行できます。

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

globを使用できる場合は、個々のファイルを処理しないでください

個々のファイルを処理する必要がない場合は*、シェルのグロブ文字を利用して、変数を他のコマンドに渡すときに引用してください。難しいファイル名の処理がはるかに簡単になります。

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

の使用に注意してください./-ファイル名に先頭が含まれる可能性のあるファイル名に対する安全策-


6

スペースを含むフォルダーを開くには、次のように引用符で囲むcd "Some Directory"か、バックスラッシュでスペースをエスケープしますcd /home/kudic/Radna\ površina


3
または、次のようにバックスラッシュでスペースをエスケープしますcd /home/kudic/Radna\ površina
Timo

素晴らしい点!言及するのを忘れました。私は通常、クォートを習慣から外しますが、実際には長期的にはバックスラッシュを使用する方が適切です。
コーリーウィテカー

1
または'Radna površina'、環境変数($VARNAME)を展開したり、コマンドをバッククォートで囲ったり$()実行したりしたくない場合(またはファイル名に二重引用符がある場合)、一重引用符()を使用します。
エリアケイガン

3

このディレクトリがホームフォルダーにある場合は、次のように入力します。

cd "Milano, Torino (Jan)-Compressed"

それ以外の場合は絶対パスを指定します:

cd "/…/…/Milano, Torino (Jan)-Compressed"

ファイル名に二重引用符がある場合は、それをエスケープします \"


先頭にスラッシュを付けてパスを開始すると、ルートから始まります。あなたはそれを削除したいかもしれません。
isaaclw

@isaaclwそれは彼が絶対パ​​スとしてそれを提出した理由です:P

1
ああ、それは「可変」フォルダーを示す3つのドットです。「親フォルダー」を示す2つのドットであると想定しました。謝罪。
isaaclw

3

この場合、最善ではありませんが、ワイルドカードを使用することもできます。あなたが試すことができます:

cd *Torino*

他の人と共有されていないディレクトリの名前に明確な単語またはフレーズがある場合、この方法を使用することをお勧めします。たとえば、マウントポイント/ media / DataSSDおよび/ media / DataHDDがあります。名前のほぼ半分を入力するまでオートコンプリートは機能しないため、HDDパーティションにアクセスするには、入力するだけです

cd /media/*HD*

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.