私はタイプミスをしました:
$ 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と入力できないのは明らかです:-/このファイルを削除するにはどうすればよいですか?
^V
(ctrl+v)次のキーを押すための一種のエスケープシーケンスとして機能し、通常関連付けられているアクションを実行する代わりに、関連付けられた値を挿入します。
これを利用して、^V^C
(ctrl+v、 ctrl+c)端末に難しいファイル名を入力するために機能するはずです。
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
、引数の順序が重要!
別のオプションは、rm -ri ./*
を使用することです。 rm
は、ファイルとディレクトリを削除する前に尋ねるので、「不良」ファイルにy
を返信し、その他すべてにn
を返信する必要があります。
実際、あなたの場合、「悪い」ファイルは1文字しかないため、rm -ri ./?
を実行することで、必要な返信の数を減らすこともできます。
1つのオプションは、ls
以外のものでファイル名を検索することです。あなたがそれが逐語的に作成されたことを知っているなら Ctrl+C、ASCII 制御文字のテーブル を使用して生成された文字、またはPythonが提供するようなよりフレンドリーなインターフェースを使用して作成できます。
_>>> import os
>>> os.listdir('.')
['\x03', ...]
_
もう1つのオプションは、ls
の出力の16進ダンプを調べることです。 hexdump
。
次に、(たとえば)次のbashコマンドを使用してファイルを削除できます。
_rmdir "$(printf '\x03')"
_
(二重引用符は、印刷しようとしている文字がIFS
変数にある場合にのみ必要です(_\x20
_や_\x0A
_など)。ただし、コマンド置換を引用符で囲むのはよい習慣です。シェルでフィールド分割などを実行したい場合を除きます)
多くの場合、この種の状況では、関連ファイルに一致するワイルドカードパターンを思い付くのは簡単です。
あなたの場合、これは単に?
(正確に1文字ですべてのファイル名を照合します)。
それが本当にあなたが望むものと一致していることを確認してください:
ls -ld ?
次に、ディレクトリを削除します。
rmdir ?
これをタブ補完と組み合わせることもできます。入力できます
rmdir ?
そしてタブを押し、そして例えばbashでは、次のように置き換えられます
rmdir ^C/
enterキーを押すと、必要な処理が実行されます。
Midnight Commander(mc)を使用してファイルを削除できます-上/下ボタンで選択してF8キーを押します。
エンコーディングのためにファイル名に奇妙な文字が含まれていたときに、たまにそうしました。
さらに別の方法:stat
を使用して、ディレクトリ名のエスケープ表現を取得します。
$ stat *|grep File:
File: ‘\003’
これでファイル名の表現がわかったので、printf
を使用して名前でファイルを削除できます。
$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’
または、bashを使用している場合は、printf
を回避できます。
$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’
私のために働いた解決策は:
rm ./[Tab][Tab][Tab]...
削除したいファイルが見つかるまで、利用可能なファイルを循環させます。
ただし、シェルで 必要な設定 を機能させる必要があります。
最も簡単な方法は、すべてを一時ディレクトリに移動してからrm -r DIRNAME
。
それが唯一の空のディレクトリである場合(または他の空のディレクトリを削除する必要がない場合)は、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
オプションがありません。これは、おそらく空のディレクトリは通常価値がなく、単に再作成できるためです。