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?


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 ..

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"



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.


1
rm -fr ./-A

Perintah di atas bekerja untuk saya.


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$

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

-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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.