web-dev-qa-db-ja.com

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

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

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 ?
(  )  *  ?  \

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

42
Pomario

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

端末がスペースをセパレータとしてではなく文字として意味することがわかるように、スペース(およびその他のすべての特殊文字)を "mask"にする

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

または、フォルダー名またはパスをquotesに入れます。

cd "Milano, Torino (Jan)-Compressed"
43
krystoph

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

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

別の方法:ドラッグおよびドロップ

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

次のように書きます:

cd 'Milano, Torino (Jan)-Compressed'

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

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

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


あなたが求めているのはQuotingと呼ばれるものです:

引用は、シェルに対する特定の文字または単語の特別な意味を削除するために使用されます。 (…)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 “?”

bash 's Programmable Completion (aka Tab ↹ 完了)は、エスケープ文字\で特殊文字を自動的にエスケープします。

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

二重引用符で文字を囲むと、$`\、および履歴展開が有効になっている場合は!を除き、引用符内のすべての文字のリテラル値が保持されます。

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

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 “?”

$`、および!は、二重引用符内で特別な意味を保持するため、 Parameter ExpansionCommand SubstitutionArithmetic Expansion および History Expansion は、二重引用符で囲まれた文字列に対して実行されます。

シングルクォートで引用する' '

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

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

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/QUOTINGwiki.bash-hackers.org および tldp.org

22
dessert

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

特に、$'...'タイプの引用符を使用して、\n\tなどのANSI-Cバックスラッシュ文字を使用できます。 bash 4.3マニュアルから:

$ 'string'という形式の単語は特別に扱われます。 Wordは文字列に展開され、バックスラッシュでエスケープされた文字は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を使用できる場合は、個々のファイルを処理しないでください

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

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

./の使用に注意してください。これは、先頭に-が含まれている可能性のあるファイル名に対する保護策です。

10

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

6
Corey Whitaker

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

cd *Torino*

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

cd /media/*HD*

3
user242845

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

cd "Milano, Torino (Jan)-Compressed"

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

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

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

3
Harshveer Singh