「--」という名前のディレクトリを削除する方法(単一引用符は名前の一部です)

「--」という名前のディレクトリを削除する方法(単一引用符は名前の一部です)

誤って作成されたスクリプトのため、'--'私のホームディレクトリに(一重引用符を含む)というディレクトリが作成されました。

そのディレクトリに入ると、cdホームディレクトリに戻ります。

このプロジェクトを削除したいのですが、どうすればいいかわかりません。ディレクトリ名の一部またはすべての文字をエスケープして返しますNo such file or directory

Linuxバージョン

Linux version 5.11.0-1022-aws (buildd@lgw01-amd64-036) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #23~20.04.1-Ubuntu SMP Mon Nov 15 14:03:19 UTC 2021

答え1

あなたの場合、実際には名前の一部として引用符があるので、次のことができます。

rm -r \'--\'

または

rmdir \'--\'

より一般的なケースでは、引用符が名前の一部ではないため、-名前がオプション(次に始まる)のように見えることも処理する必要があります。この場合、古典的なアプローチは次のとおりです。

  1. オプションが次から始まってもオプションとして解析されないように、オプションの終わりを示すために--使用されます。---

     rmdir -- "'--'"
    
  2. フルパスを使用するか、次を使用します(ただし、シェルから./保護するには名前を引用する必要があります)。'

     rmdir ./"'--'"
    
  3. GNUの使用find:

     find . -name "'--'" -delete
    
  4. 他のものを使用してください。パールのように:

     perl -e "rmdir(\"'--'\")"
    

上記のすべての内容は、ディレクトリが空であると仮定しています。そうでない場合は、次のいずれかを使用してください。

rm -r ./"'--'"

または

rm -r -- "'--'"

答え2

他の答えが示すように、引用符、バックスラッシュ、スペース、改行などを含む「興味深い」名前の場合は、引用符および/またはエスケープが必要です。

ただし、ターミナルで(スクリプトではなく)インタラクティブにファイル名を操作したい場合は、タブ補完機能は引用を書くのに本当に役立ちます。

お持ちのディレクトリ名を使用して、次のように入力します。

rm -r \'<tab>

<tab>キーボード文字の左側にあるTabキーはどこにありますか?最初の一重引用符は特殊文字なので、エスケープをQ使用します。\'

一重引用符文字で始まる他のファイル/ディレクトリがない場合、bashはファイル名を正しくエスケープして完成します。

rm -r \'--\'/

注:ファイル名の最初の文字はマイナス文字では--ないため、他の回答で提案された「オプションの終わり」シーケンスを追加する必要はないようです。-

答え3

$ mkdir -- \'--\'
$ ls
'--'
$ rmdir -- \'--\'
$ ls
$

答え4

GNU coreutilsバージョンls(Linuxで利用可能)には、--quoting-style印刷できない、またはその他の興味深い文字を含む名前の表示方法を制御するオプションがあります。に設定すると、shell-escapeさまざまなシェル引用符を使用して出力を読みやすくします。シェル入力として有効。この出力をコピーして、シェルのコマンドラインに引数として貼り付けることができますrm

ただし、特殊文字を読みやすくするために引用符を使用しており、$'...'現在ほとんどのシェルはこれをサポートしていますが、すべてのシェルがサポートしているわけではありません。特にDebianとUbuntuで使用されているDashシェルは/bin/shそれをサポートしていないようです。しかし、Bash、ksh、zshは確かにそうです。

ここで、2番目のファイルは'--'二重引用符で囲まれたyoursであり、他のファイルはCtrl-A、タブ、改行、一重引用符、末尾のスペースなどの文字を含む嫌悪感のあるファイルです。ここでは$'..'バックスラッシュエスケープを使用します。

$ ls --quoting-style=shell-escape -1
''$'\001\t'\''foo'$'\n''bar '
"'--'"

ls出力を最小限に抑える試みはないようです。最初の出力はそのまま印刷できます$'\001\t\'foo\nbar '。)

この出力を使用して、次のいずれかまたは両方を削除できます。

$ rm -- ''$'\001\t'\''foo'$'\n''bar '
$ rm -- "'--'"

--lsファイル名がダッシュで始まる場合は、ダッシュが引用符で示されていてもダッシュを使用する必要があります。

shell-escape私はこれが最近のバージョンでも使用されるデフォルトの引用スタイルだと思いますls(少なくとも出力はそうです)。したがって、実際に長いオプションを綴る必要はありません。

関連情報