web-dev-qa-db-ja.com

シェルレスポンシブ文字のセットで名前が付けられたLinuxファイルを削除します

私のソフトウェアをテストするために、\;:$"\'という名前のファイルを作成しました。ファイルのプロパティを削除できないため、エラーが発生しました。 rmを介して削除する正確な文字の組み合わせを見つけようとしていますが、方法が見つかりません。

rm \\;:$\"\\\'
rm: cannot remove `\\': No such file or directory

rm "\\"\;:$\"\\\'
rm: cannot remove `\\;:$"\\\'': No such file or directory

rm '\;:$"\'''
rm: cannot remove `\\;:$"\\': No such file or directory

(この最後の試みは私を殺しました)

そして他の多くの試み。助けが必要です!

7
Alex

ファイル名が正確に\;:$"\'の場合は、次の方法で削除できます。

rm \\\;\:\$\"\\\'

1つの\ですべての文字をエスケープするだけです。

12
chaos

ファイルを含むディレクトリでls -liを試し、find . -inum <inode-number> -exec rm -i {} \;を発行してiノードが返されたファイルを削除できます。

予想よりも別のファイルがfindコマンドで見つかった場合に備えて、削除する前にプロンプ​​トを表示するfindコマンドに-iを追加しました。

コメントに加えて、私は自分でファイルを作成して削除しようとしました。

ls -l
total 0
-rw-r--r-- 1 test test 0 mrt 24 14:11 \;:$"\'

[test@testhost +1] /tmp/ff$ rm \\\;\:\$\"\\\' 

[test@testhost +1] /tmp/ff$ ls -l
total 0
5
Lambert

一重引用符を使用でき、一重引用符自体を引用することだけを心配する必要があります。

rm '\;:$"\'\'

インタラクティブな使用では、'\または\\で始まるタブ補完を使用できます。 '\からのタブ補完は、'\;:$"\'\'''を生成します。これは、bashがすべての埋め込まれた一重引用符を'\''に置き換えるだけだからです。何もないところから、または\\からタブを補完すると、\\\;\:\$\"\\\'が生成されます。

2
Random832

Bashおよび同様のシェルで

read -r; rm "$REPLY"

次に、ファイル名を文字通り\;:$"\'と入力し、Enterキーを押します。 readコマンドは、標準入力から行を読み取り、それを変数REPLYに保存します。 -rフラグは、行を文字通り読み取り、バックスラッシュをエスケープシーケンスとして解釈しないように指示します。 $REPLYを引用すると、REPLYの内容が単一の引数としてrmに渡されるため、ファイル名にスペースやタブが含まれている場合でも機能します。

(注:ファイル名に改行文字が含まれている場合は、-dオプションをreadに使用して、入力する文字列の終了文字を変更できるようです。)

2
Brian

Bashまたは別のシェルスクリプト環境の使用に限定されていない場合、そのようなファイルを削除する簡単な方法は、お気に入りの言語でunlink()を呼び出すだけの短いプログラムを作成するか、ファイルを使用することです。ファイルを手動で削除するGnomeCommanderやMidnightCommanderなどのマネージャー。後者のオプションを使用すると、ファイル名をどこにも入力しなくても、問題のファイルを選択して削除できます。これにより、メタ文字が特別な意味を持つ可能性がまったくなくなります。

1
a CVn

これを試して、

$ rm \\\;\:\$\"\\\'

「\」は、文字通りの意味を持つbashスクリプトのエスケープシーケンスとして使用されます。

0
Vengat

このような場合、最大で数文字を入力/エスケープしてから、bashに<TAB>を使用してコマンドを完了させるのが最も簡単だと思います。bashは、それ自体の目的に適したものを引用するようにします。

この場合、私がそうするなら

touch '\;:$"\'\'
rm \ <TAB>

繰り返される<TAB>の完了は、その後

rm \\
rm \\\\
rm \\\\\\\\
rm \\\;\:\$\"\\\' 

今、私は実際には中間段階を説明するのに少し戸惑っていますが、最終的な提案は賢明です。

補完を使用しない場合の経験則として、私はそれを'...'マークに含めることによってすべてを引用する傾向があります。明らかに、'自体を'\''として書き込む必要があります。つまり、引用符を終了し、\;を書き込んで単一の'を生成し、別の引用符で囲まれた文字列を再入力します。これは、何も追加されないため、最終結果の''を省略することを除いて、touchコマンドに使用したレシピです。

0
user431067

もう1つの良い解決策は、インストールすることです oh-my-zsh
typerm、およびtabをファイルに追加削除したい。 ;)

0
Trevor Hickey