web-dev-qa-db-ja.com

FreeBSD:^ Cというディレクトリ(本当に!)-削除する方法?

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

$ 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と入力できないのは明らかです:-/このファイルを削除するにはどうすればよいですか?

128
Mausy5043

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

これを利用して、^V^Cctrl+v、 ctrl+c)端末に難しいファイル名を入力するために機能するはずです。

189

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
$ 

おめでとうございます。ファイルをall消去しました。 With find引数の順序が重要

90
bishop

別のオプションは、rm -ri ./*を使用することです。 rmは、ファイルとディレクトリを削除する前に尋ねるので、「不良」ファイルにyを返信し、その他すべてにnを返信する必要があります。

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

32
Matteo Italia

1つのオプションは、ls以外のものでファイル名を検索することです。あなたがそれが逐語的に作成されたことを知っているなら Ctrl+C、ASCII 制御文字のテーブル を使用して生成された文字、またはPythonが提供するようなよりフレンドリーなインターフェースを使用して作成できます。

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

もう1つのオプションは、lsの出力の16進ダンプを調べることです。 hexdump

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

_rmdir "$(printf '\x03')"
_

(二重引用符は、印刷しようとしている文字がIFS変数にある場合にのみ必要です(_\x20_や_\x0A_など)。ただし、コマンド置換を引用符で囲むのはよい習慣です。シェルでフィールド分割などを実行したい場合を除きます)

23
Jakob

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

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

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

ls -ld ?

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

rmdir ?

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

rmdir ?

そしてタブを押し、そして例えばbashでは、次のように置き換えられます

rmdir ^C/

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

15
Jukka Suomela

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

エンコーディングのためにファイル名に奇妙な文字が含まれていたときに、たまにそうしました。

11
filo

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

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

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

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

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

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

私のために働いた解決策は:

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

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

ただし、シェルで 必要な設定 を機能させる必要があります。

6
joeytwiddle

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

5
Kondybas

それが唯一の空のディレクトリである場合(または他の空のディレクトリを削除する必要がない場合)は、se 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._]/のようなより具体的なグロブ式を使用して、非英数字またはアンダースコアのファイル名で始まるディレクトリに一致させることができます。 .も含めましたが、グロブ式は.と通常は一致しません。


他の人が指摘したように、グロブを?の単一文字の名前に制限できます:rmdir ?/

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

1
Peter Cordes