名前にハイフンが含まれるUNIXディレクトリの削除


13

私の側で骨の折れた操作をして、誤って(たとえば)-Aというディレクトリを作成し、ファイルでいっぱいにしてしまいました。

上記のディレクトリを削除したい。私はもう試した:

rmdir -- -A

しかし、そのディレクトリにはまだファイルが残っていることがわかります。そして、そのファイルを削除するためにディレクトリにcdする方法がわかりません。

この厄介なディレクトリを削除するにはどうすればよいですか?


5
幸いなことに、ディレクトリの名前は「-rf *」ではありませんでした。
user1686 09

stackoverflowunixでも同じです。
ドリアン

回答:


29

すべてのコマンドで-を使用します。

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..

11

ファイルの前に./を置くことができます。そのようにすると、rmまたはrmdirは、ファイル名がオプションフラグであるかのように動作しません。

オプションを発行することもできます。これは、rmにその後のすべてがファイル名であり、それ以上オプションを処理しないように動作するように指示します。RMのファンキーな古いバージョンはそれに従わないかもしれませんが、私のアンティークユニックスの動物園は最近非常に小さくなっているので、どのバージョンか、または理解できないバージョンがあるかどうかはわかりません-。

とにかく削除するときは、名前の前に./を置く習慣を身に付ける必要があります。ディレクトリに-rまたは-rfという名前のファイルがあるかどうかはわかりません。常に使用する必要があると言うことができますが、。/がより自然であることがわかります。これは、「*が発生した場合でも、このディレクトリ内のファイルを削除したい」ことを明示するためです。



2

rmdirは、その中に何かがあるディレクトリを削除しません。「rm -rf」になります。rmdirは「rm -rf」よりもかなり安全です。Mooの答えはおそらくおそらく最高です。


1
rm -fr ./-A

上記のコマンドは私のために機能します。


0

別の方法は、inodeで削除することです(これは、rmだけでは削除が難しい他の文字を含むファイル/ディレクトリで機能します)。

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$

rmにはコマンドラインで-A引数が渡されますが、オプションとして解釈しようとするので、先頭にダッシュが表示されないようにする必要があります(二重ダッシュまたは./の前に名前の残りの部分
クリス

「。」から検索しているため、検索は自動的に先頭に追加されます。渡されるファイル名は「./-A」、またはファイルが呼び出される可能性のあるもので、先頭に./が追加され、コマンドに対して適切にエスケープされます。
baumgart

Nit:-exec名前をエスケープせず、必要もありません。exec*syscallsの1つを介して渡される引数は実際の名前です。シェルが正しい(引用符なしで)実際の名前を渡すために引用されるスペースセミコロンアスタリスクなどの特殊文字を必要とするのは、シェル入力のみです。とはfind -exec rm -f {}いえ、このQを要求されたディレクトリではなく、ファイルに対してのみ機能します。find -exec rm -rf {}ディレクトリと空でないディレクトリさえも処理しますが、スキップfindして実行するだけの方rm -rf ./-Aがはるかに簡単です。
dave_thompson_085

0

findは、次の方法でディレクトリを削除できます。

find . -type d -iname '-A' -delete

-1

という名前のディレクトリを削除しようとしていました-p。@Mooの答えはrm ./-p、Googleで検索した後、多くのWebページで広く利用可能な、私ができなかったことを達成しました。

別の方法は、iノード番号を使用することです。ここで説明する方法を使用しました。

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

つまり、次のコマンドを使用します。

  1. ファイルまたはディレクトリのiノード番号を表示します。
ls -il
  1. ファイルまたはディレクトリの引数を使用してfindコマンドを使用し-exec rm -irfます-exec rm -ifdr
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

-fフラグ内でを使用してください。そうしないと、bashはディレクトリまたはファイルを見つけることができないと文句を言います。

テスト済み:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
これは、10年前のbaumgartの回答とほぼ同じですが、から呼び出す場合rm -dは通常は必要ありませんが、ディレクトリ必要ですが、ファイルに必要ありません。修正しても、この方法は依然として不器用で劣っています。空ではないディレクトリの場合は、ディレクトリをrに設定し、権限設定に応じてfを設定します。-ffind-rrm -fr ./-p
dave_thompson_085

1
両方の方法は、以前の回答ですでに言及されています。
RalfFriedl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.