Menghapus direktori UNIX dengan tanda hubung di namanya

13

Melalui manuver berkepala tulang di pihak saya, saya tidak sengaja membuat direktori bernama (misalnya) -A, dan akhirnya mengisinya dengan file.

Saya ingin menghapus direktori tersebut. Saya sudah mencoba:

rmdir -- -A

tetapi kemudian memberitahu saya bahwa direktori tersebut masih memiliki file di dalamnya. Dan saya tidak tahu bagaimana cara cd ke direktori untuk menghapus file tersebut.

Apa yang harus saya lakukan untuk menyingkirkan direktori yang merepotkan ini?

Kate Bertelsen
sumber
5
Untungnya direktori itu tidak bernama '-rf *'.
user1686
Sama pada stackoverflow dan unix .
Dorian

Jawaban:

29

Gunakan - pada setiap perintah.

$ 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 ..
Melenguh
sumber
11

Anda dapat meletakkan ./ di depan file - dengan begitu rm atau rmdir tidak akan berperilaku seolah-olah nama file adalah flag opsi.

Anda juga dapat mengeluarkan opsi - yang memberitahu rm untuk bertindak seolah-olah semuanya setelah - adalah nama file dan tidak boleh memproses opsi lagi. Mungkin ada versi rm funky yang lebih lama yang tidak mematuhinya, meskipun kebun binatang unix antik saya telah menjadi sangat kecil hari ini jadi saya tidak bisa memberi tahu Anda yang mana atau jika ada versi yang tidak mengerti -.

Anda harus membiasakan meletakkan ./ di depan nama ketika Anda menghapusnya - Anda tidak pernah tahu apakah ada file bernama -r atau -rf di direktori Anda. Anda dapat mengatakan bahwa Anda harus selalu menggunakan - tetapi saya menemukan bahwa ./ lebih alami karena membuat eksplisit bahwa "Saya ingin menghapus file di direktori ini, bukan apa pun * yang terjadi pada glob out to"

chris
sumber
4

Ganti nama itu lalu tangani secara normal:

$ mv -- -A foo
$ find foo
$ rm -rf foo
David Mackintosh
sumber
2

rmdir tidak akan menghapus direktori dengan apa pun di dalamnya. "rm -rf" akan. rmdir jauh lebih aman daripada "rm -rf". Jawaban Moo mungkin masih yang terbaik.

David Pashley
sumber
1
rm -fr ./-A

Perintah di atas bekerja untuk saya.

q0987
sumber
0

Metode lain adalah menghapus dengan inode (ini berfungsi untuk file / direktori dengan karakter lain yang sulit untuk dihapus hanya dengan 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$
Baumgart
sumber
rm masih akan meneruskan argumen -A pada commandline dan masih akan mencoba menafsirkannya sebagai opsi, jadi Anda masih perlu mencegahnya melihat dasbor terdepan entah bagaimana (melalui jalur ganda atau dengan meletakkan ./ di depan sisa nama.
chris
Temuan akan menambahkannya secara otomatis, karena Anda menemukan dari '.' Nama file yang disahkan adalah './-A', atau apa pun nama file yang dipanggil, diawali dengan ./ dan lolos dengan benar untuk perintah.
baumgart
Nit: -exectidak luput dari namanya, dan tidak perlu; argumen yang dikirimkan melalui salah satu exec*syscalls adalah nama sebenarnya. Ini hanya input shell yang memerlukan karakter khusus seperti tanda bintang ruang asterisk dll. Dikutip untuk mendapatkan shell untuk melewati nama sebenarnya (TANPA tanda kutip) yang benar. Yang mengatakan, find -exec rm -f {}hanya berfungsi untuk file, bukan direktori seperti yang diminta untuk Q ini; find -exec rm -rf {}memang menangani direktori dan bahkan direktori kosong, tetapi melompat find- lompat dan melakukan rm -rf ./-Ajauh lebih mudah.
dave_thompson_085
0

find dapat menghapus direktori dengan cara ini:

find . -type d -iname '-A' -delete
ThorstenS
sumber
-1

Saya mencoba menghapus direktori bernama -p. @Moo menjawab apa yang saya tidak bisa rm ./-p, yang tersedia secara luas di banyak halaman web setelah pencarian Google.

Metode lain adalah dengan menggunakan nomor inode. Saya menggunakan metode yang dijelaskan di sini:

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

Singkatnya, gunakan perintah berikut:

  1. Untuk menampilkan nomor inode file atau direktori.
ls -il
  1. Gunakan findperintah menggunakan -exec rm -irfargumen untuk file atau -exec rm -ifdrdirektori.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Pastikan Anda menggunakan bagian -fdalam flag, jika tidak, bash akan mengeluh karena tidak dapat menemukan direktori atau file.

Diuji pada:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
Andres Salgado
sumber
1
Ini hampir duplikat dari jawaban baumgart dari 10 tahun yang lalu, tetapi Anda tidak perlu rm -ddan biasanya tidak -fketika memohon dari find, tetapi Anda perlu -runtuk direktori dan tidak perlu untuk file. Bahkan ketika dikoreksi metode ini masih kikuk dan inferior. Untuk direktori non-kosong lakukan saja rm -fr ./-p- itu r untuk direktori, dan f tergantung pada pengaturan izin.
dave_thompson_085
1
Kedua metode sudah disebutkan dalam jawaban sebelumnya.
RalfFriedl