FreeBSD:^ Cと呼ばれるディレクトリ(本当に!)-削除方法


127

私はタイプミスをしました:

$ history
169 9:34    la /usr/local/etc/
170 9:35    sudo mkdir ^C
171 9:36    sudo mkdir /usr/local/etc/dnsmasq.d

^ C(ctrl + C)というファイルができました!! 使用するlsと、疑問符が表示されます(おそらくロケールによるものですか?)

% ls -al
total 60
drwxr-xr-x  2 root   wheel    512 Jan 21 09:35 ?        <- this one
drwxr-xr-x  5 admin  wheel    512 Jan 21 16:24 .
drwxr-xr-x  3 root   wheel    512 Jan 20 14:29 ..
-rw-r--r--  1 admin  nobody  1114 Jan 20 19:10 .cshrc
-rw-------  1 admin  wheel   6002 Jan 21 15:27 .history
-rw-r--r--  1 admin  nobody   182 Jan 20 14:29 .login
-rw-r--r--  1 admin  nobody    91 Jan 20 14:29 .login_conf
-rw-------  1 admin  nobody   301 Jan 20 14:29 .mail_aliases
-rw-r--r--  1 admin  nobody   271 Jan 20 19:04 .mailrc
-rw-r--r--  1 admin  nobody   726 Jan 20 19:05 .profile
-rw-------  1 admin  nobody   212 Jan 20 14:29 .rhosts
-rw-r--r--  1 admin  nobody   911 Jan 20 19:06 .shrc
drwx------  2 admin  nobody   512 Jan 20 15:05 .ssh
drwxr-xr-x  2 admin  wheel    512 Jan 20 19:08 bin

そして

% ls -i
3611537 ?   3611534 bin

このファイルを削除したいです。私は試してみてmv、タブ補完を使用すると、それが表示されます:

% mv
^C/  bin/

明らかに^ Cを入力することはできません:-/このファイルを削除するにはどうすればよいですか?


11
dswがPOSIXに入れなかったのは残念です。
マークプロトニック

12
@MarkPlotnick:オリジナルがあまりにも悪く dsw POSIXに入れなかった
マッテオイタリア

4
ctrl + Cという名前ではなく、おそらくそのキーボードショートカットにマッピングされているascii文字、つまりETX(ascii 3)にちなんで命名したと思います。コンソールフォントにはその文字のグリフがないため、汎用置換グリフ「?」を使用します。
ジグガンジャー

5
emacs -nw -f diredディレクトリナビゲータを提供します。<kbd> D </ kbd>は、確認後にカーソルの下のファイルを削除します。
するThorbjörnRavnアンデルセン

9
これは、ファイル名およびその他であまりにも悪いの制御文字だ@MatteoItalia ばかげた アイデアがPOSIXにそれを作った...
パイプ

回答:


188

^Vctrl+ v)は、次のキープレスの一種のエスケープシーケンスとして機能し、通常関連付けられるアクションを実行する代わりに、関連付けられた値を挿入します。

これを利用して、^V^Cctrl+ vctrl+ c)ターミナルに難しいファイル名を入力するために動作するはずです。


41
これはおそらくOPがそもそもタイプミスをした方法だったでしょう。VとCはキーボード上で隣り合っています。
スティグヘメル

14
または、bsdターミナルでWindowsクリップボードを使用しようとしていました。
ジョエルCoel

2
@JoelCoelの習慣は決して死なない!
マフィイ

1
興味深いことに、Zshラインエディターでは^V^C機能しませ引用挿入のウィジェットは、(のためのページを検索する^V)、明示的に割り込み文字を挿入しません。Jakobの答え(printfを使用)は、シェル引数で制御文字を提供するより移植性の高い方法かもしれません。
マイル

@StigHemmer:コマンドの途中でCtrl-Cを押してから、これを忘れて、後でコマンドをコピーアンドペーストすることもできます。
Mehrdad

89

iノードでファイルを削除することもできます。

$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete

あなたが何をするにしても、神のために、-delete前に置かないでください-inum

$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 

おめでとうございます、あなたはすべてのファイルを消去しました。ではfind引数の順序が重要です!


2
-delete前に置いてみません-inumか?これは、Enterキーを時期尚早に押した場合、または引数の順序が実際に結果に影響する場合の予防策ですか?
detuur

10
@detuur:順序は結果に影響します。編集を参照してください。
ビショップ

37
-delete必要-deleteなものが見つかっていることを確認せずにコマンドを実行するまで、コマンドにピリオドを入れないでください。
カズ

2
@Kazは、コマンドの中心に-deleteを追加してもあまり役に立ちません
-RiaD

9
@Kazを使用する-print代わりに-delete非常に良いテストを行います。
マークランサム

32

別のオプションは、使用することrm -ri ./*です。rmファイルとディレクトリを削除する前に尋ねるのでy、「悪い」ファイルとn他のすべてのファイルに返信するだけです。

実際、あなたの場合rm -ri ./?、あなたの「悪い」ファイルはたった1文字の長さなので、することで必要な返信の数を減らすことさえできます。


8
select f in ?; do rm -i "$f"; break; doneは、主要な望ましくないもの-iに答えnoたり、保持したいものに誤ってイエスと答えたりする苦労なしに、のすべての利点を持っています。
ビショップ

6
OPの場合、ファイルではなくディレクトリです。 rmdir ?/空の単一文字のディレクトリをすべて削除し、他のディレクトリが空でないことを訴えます。
ピーター

2
@司教:おっ、私はそれがselect存在することさえ知らなかった、かなりきれい!
マッテオイタリア

@PeterCordes:おっと、ディレクトリについて話していることに気付かなかった。残念ながらフラグをサポートしていないので、例に追加しました-r(そして./、忘れがちです)。それでも、この場合の最善の方法は司教とあなたのコメントの組み合わせだと思います。rmdir-i
マッテオイタリア

1
@MatteoItalia selectはいくつかのシェルにしか存在しないため、おそらく実行されていないのはこのためです-移植性のあるスクリプトやソリューションはそれを避けるため、「野生」である可能性は低くなります。
mtraceur

23

1つのオプションは、ファイル名を以外で検索することですls。逐語Ctrl+ によって生成されたことがわかっている場合は、制御文字のテーブルをC使用して、またはPythonが提供するようなより使いやすいインターフェイスで生成されたASCII文字を見つけることができます。

>>> import os
>>> os.listdir('.')
['\x03', ...]

別のオプションはls、例えばを使用して、の出力の16進ダンプを調べることhexdumpです。

次に、次のbashコマンドを使用してファイルを削除できます。

rmdir "$(printf '\x03')"

(二重引用符は、あなただけは、印刷しようとしているキャラクターは、あなたの中にある場合に必要とされているIFS変数のような、\x20または\x0A、あなたがシェル等フィールド分割を、実行したい知っている限り、コマンド置換を引用する良い習慣です)


2
また、cat -v(プラスman ascii)は最初の部分に役立ちます。
マッテオイタリア

13
...またはos.rmdir('\x03')、Pythonシェルから直接使用します。
moooeeeep

15

多くの場合、この種の状況では、関連するファイルに一致するワイルドカードパターンを簡単に思い付きます。

あなたの場合、これは単純です?(すべてのファイル名を正確に1文字に一致させます)。

それが本当にあなたが望むものと本当に一致することを確認してください:

ls -ld ?

次に、ディレクトリを削除します。

rmdir ?

これをタブ補完と組み合わせることもできます。入力できます

rmdir ?

Tabキーを押すと、たとえばbashで置き換えられます

rmdir ^C/

Enterキーを押すと、必要な処理が実行されます。


11

Midnight Commander(mc)を使用してファイルを削除できます。上/下ボタンで選択してF8を押すだけです。

エンコードのためにファイル名に奇妙な文字が含まれている場合に、時々それを行いました。


4
または、他のファイルマネージャーについて。
スティグヘメル

@StigHemmerはもちろん、特定のファイル名を表示するために他のものよりも優れているものもあります。おそらく、答えは、MCが他のいくつかの選択と比較して最適な選択である理由を説明できます。私はそれを使用したことがないので、私は知りません。
can-ned_food

7

さらに別の方法:を使用statして、ディレクトリ名のエスケープ表現を取得します。

$ stat *|grep File:
  File: ‘\003’

これでファイル名の表現がわかったので、次を使用して名前でファイルを削除できますprintf

$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’

または、bashを使用している場合は、回避できますprintf

$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’

ところで、シェルがbashの場合、$'\x03'printfを呼び出すよりも簡単です。FreeBSD shの場合も同じですが、POSIXシェル上にいくつかのおいしい機能が追加されています。
ネッチ

bashについての@Netchの良い点です$'...'が、一般に8進数から16進数への無用な変換は避けたいと思います。たとえば、ファイルに名前が付けられた場合'\111'stat出力で)はどうなりますか?を使用して削除し$'\x49'ますか?statあなたが与えたのと同じシーケンスを使用する方が良い:OPの場合、rmdir $'\003'
ルスラン

6

私のために働いた解決策は次のとおりです。

rm ./[Tab][Tab][Tab]...

削除したいファイルが見つかるまで、利用可能なファイルを循環します。

しかし、それを機能させるにはシェルに必要な設定必要です。


^ Cはタブシーケンスの非常に早い段階なので、+ 1を行います。
-joshudson

5

最も簡単な方法は、すべてを一時ディレクトリに移動してからに移動することrm -r DIRNAMEです。


7
これは受け入れられた答えよりも本当に簡単に思えますか?

2
@chicks:実際にはそれほど悪い答えではありません。^ V ^ Cが機能しないので、誰かが動けなくなるかもしれません。
-joshudson

それ自体は間違っていませんが、より直接的なソリューションと比較して、多くの余分な作業のようです。Linuxに甘やかされているかもしれ^vませんが、長年一貫して働いてきました。

6
@chicksに^Vは特定の知識が必要ですが、ファイルを移動したり、親ディレクトリを削除したりすることは基本から導き出すことができます。
コンディバス

5
Ctrl + Vは、実際の作業環境によっては危険なほど曖昧です。一部のターミナルエミュレータは、それを貼り付けとして解釈する可能性があります。貼り付けバッファに、削除したくないものの名前と改行が含まれている場合は、問題が発生している可能性があります。
rackandboneman

1

それが唯一の空のディレクトリである場合(または他の空のディレクトリを削除する必要がない場合)、を使用しますrmdir */rmdir空でないディレクトリを削除できないというエラーメッセージが表示されますが、それで問題ありません。GNU rmdirサポート--ignore-fail-on-non-empty、または可能2>/dev/nullです。

末尾/は、グロブをディレクトリ名のみに一致させます。

を使用して、現在のディレクトリの下に存在する空のディレクトリを事前に確認でき
find -maxdepth 1 -type d -empty -lsます。(必要-ls-delete応じてを変更できます)。

rmdir [^A-Za-z0-9._]/英数字以外のファイル名またはアンダースコアのファイル名で始まるディレクトリを照合するなど、より具体的なグロブ式を使用できます。を含めました.が、グロブ式は.とにかく通常は一致しません。


他の人が指摘しているように、次のglobを持つ単一文字の名前に制限できます?rmdir ?/

rmdirおそらく空のディレクトリは通常は価値がなく、単に再作成できるため、-iこの方法にrmはオプションがありません。


1
どのディレクトリを再作成したいかを知りたいし、オプションを(少なくともGNUで)rmdir渡せば教えてくれます-v
ルスラン

@Ruslan:気にしない他の古いディレクトリがあったとしても、それらを削除することはボーナスです。空のディレクトリを検索できますfind -maxdepth 1 -type d -empty -ls
Peter Cordes

-1

危険なことをする前に、まずこれを試してください:

rmdir -- ^C

一般的には、コマンドに-o ptionsが続かないことを伝える区切り文字ですが、奇妙な文字が他のものとして解釈されないようにすることもできます。

別の使用例は whois -r -- "-r OBJECT-RIPE"

(-rはripeのショートカットですが、ripe whoisではパラメーターでもあります)

最初に試してもうまくいかない場合は、試してみてください rmdir -- "^C"

しかし、私のcshシェルでは、私はそれのどれも必要としません、単にrmdir ^C私のためにすでに機能します。


1
cshタイピングでrmdir <ctrl> Cが続きますか?本当に?!私はそれが異なる振る舞い、つまりrmdirコマンドを中止してコマンドラインに戻ることを期待しています。
Mausy5043

それは確かになります。コマンドラインで^ C文字を入力する方法については、受け入れられている回答を参照してください。
エール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.