私の側で骨の折れた操作をして、誤って(たとえば)-Aというディレクトリを作成し、ファイルでいっぱいにしてしまいました。
上記のディレクトリを削除したい。私はもう試した:
rmdir -- -A
しかし、そのディレクトリにはまだファイルが残っていることがわかります。そして、そのファイルを削除するためにディレクトリにcdする方法がわかりません。
この厄介なディレクトリを削除するにはどうすればよいですか?
私の側で骨の折れた操作をして、誤って(たとえば)-Aというディレクトリを作成し、ファイルでいっぱいにしてしまいました。
上記のディレクトリを削除したい。私はもう試した:
rmdir -- -A
しかし、そのディレクトリにはまだファイルが残っていることがわかります。そして、そのファイルを削除するためにディレクトリにcdする方法がわかりません。
この厄介なディレクトリを削除するにはどうすればよいですか?
回答:
すべてのコマンドで-を使用します。
$ 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 ..
ファイルの前に./を置くことができます。そのようにすると、rmまたはrmdirは、ファイル名がオプションフラグであるかのように動作しません。
オプションを発行することもできます。これは、rmにその後のすべてがファイル名であり、それ以上オプションを処理しないように動作するように指示します。RMのファンキーな古いバージョンはそれに従わないかもしれませんが、私のアンティークユニックスの動物園は最近非常に小さくなっているので、どのバージョンか、または理解できないバージョンがあるかどうかはわかりません-。
とにかく削除するときは、名前の前に./を置く習慣を身に付ける必要があります。ディレクトリに-rまたは-rfという名前のファイルがあるかどうかはわかりません。常に使用する必要があると言うことができますが、。/がより自然であることがわかります。これは、「*が発生した場合でも、このディレクトリ内のファイルを削除したい」ことを明示するためです。
名前を変更して、通常どおりに処理します。
$ mv -- -A foo
$ find foo
$ rm -rf foo
rmdirは、その中に何かがあるディレクトリを削除しません。「rm -rf」になります。rmdirは「rm -rf」よりもかなり安全です。Mooの答えはおそらくおそらく最高です。
別の方法は、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$
-exec
名前をエスケープせず、必要もありません。exec*
syscallsの1つを介して渡される引数は実際の名前です。シェルが正しい(引用符なしで)実際の名前を渡すために引用されるスペースセミコロンアスタリスクなどの特殊文字を必要とするのは、シェル入力のみです。とはfind -exec rm -f {}
いえ、このQを要求されたディレクトリではなく、ファイルに対してのみ機能します。find -exec rm -rf {}
ディレクトリと空でないディレクトリさえも処理しますが、スキップfind
して実行するだけの方rm -rf ./-A
がはるかに簡単です。
という名前のディレクトリを削除しようとしていました-p
。@Mooの答えはrm ./-p
、Googleで検索した後、多くのWebページで広く利用可能な、私ができなかったことを達成しました。
別の方法は、iノード番号を使用することです。ここで説明する方法を使用しました。
https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html
つまり、次のコマンドを使用します。
ls -il
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
rm -d
は通常は必要ありませんが、ディレクトリは必要ですが、ファイルには必要ありません。修正しても、この方法は依然として不器用で劣っています。空ではないディレクトリの場合は、ディレクトリをrに設定し、権限設定に応じてfを設定します。-f
find
-r
rm -fr ./-p