Adında tire bulunan bir UNIX dizinini silme


13

Benim tarafımdaki kemikli bir manevra sayesinde, yanlışlıkla (örneğin) -A adlı bir dizin oluşturdum ve dosyalarla doldurdum.

Söz konusu dizini silmek istiyorum. Denedim:

rmdir -- -A

ancak daha sonra dizinde hala dosyalar olduğunu söylüyor. Ve adı geçen dosyaları silmek için dizine cd nasıl anlayamıyorum.

Bu zahmetli dizinden kurtulmak için ne yapmalıyım?


5
Neyse ki dizin '-rf *' olarak adlandırılmadı.
user1686

Stackoverflow ve unix için aynıdır .
Dorian

Yanıtlar:


29

Her komutta - kullanın.

$ 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

Dosyanın önüne ./ koyabilirsiniz - bu şekilde rm veya rmdir, dosya adı bir seçenek bayrağıymış gibi davranmaz.

Ayrıca rm'ye, her şeyden sonra her şeymiş gibi davranmasını söyleyen seçeneği bir dosya adıdır ve daha fazla seçenek işlememesi gerektiğini de bildirebilirsiniz. Antik unixler hayvanat bahçem bu günlerde oldukça küçük olmasına rağmen, buna uymayan korkak eski rm sürümleri olabilir, bu yüzden size hangilerini veya anlamayan sürümler olup olmadığını söyleyemem.

Herhangi bir şekilde silerken ./ adların önüne koyma alışkanlığı edinmelisiniz - dizininizde -r veya -rf adlı bir dosya olup olmadığını asla bilemezsiniz. Her zaman - kullanmanız gerektiğini söyleyebilirsiniz. Ama ./ daha doğal olduğunu düşünüyorum çünkü "Ben bu dizindeki dosyaları silmek istiyorum, * ne olursa olsun glob için ne olursa olsun"


4

Yeniden adlandırın ve sonra normal olarak onunla ilgilenin:

$ mv -- -A foo
$ find foo
$ rm -rf foo

2

rmdir, içinde hiçbir şey olmayan bir dizini silmez. "rm -rf" olur. rmdir "rm -rf" den çok daha güvenlidir. Moo'nun cevabı muhtemelen en iyisidir.


1
rm -fr ./-A

Yukarıdaki komut benim için çalışıyor.


0

Farklı bir yöntem inode ile silmek olacaktır (bu sadece rm ile silinmesi zor olan diğer karakterlere sahip dosyalar / dizinler için geçerlidir).

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 yine de komut satırında bir -A argümanı geçirilecek ve yine de bir seçenek olarak yorumlamaya çalışacaktır, bu yüzden yine de önde gelen tireyi bir şekilde görmesini önlemeniz gerekir (çift tire veya ./ adının geri kalanı
chris

'.' Öğesinden bulduğunuzdan, buluntu otomatik olarak başa çıkacaktır. Aktarılan dosya adı './-A' ya da dosyanın adı ne olursa olsun, ./ ile başlayıp komut için uygun şekilde kaçtı.
baumgart

Nit: -execadından kaçmaz ve buna gerek yoktur; exec*sistem çağrılarından biri üzerinden iletilen argüman gerçek isimdir. O sadece kabuk doğru (tırnak OLMADAN) gerçek adını geçmesine kabuk almak için alıntı noktalı virgül yıldız vb uzay gibi özel karakterleri ihtiyacı girişi. Bununla birlikte, find -exec rm -f {}bu Q için istendiği gibi bir dizin için değil , sadece bir dosya için çalışır; find -exec rm -rf {}dizin ve hatta boş olmayan dizin işlemek, ancak atlama findve sadece yapmak rm -rf ./-Açok daha basit.
dave_thompson_085

0

find dizini şu şekilde silebilir:

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

-1

Adlı bir dizini silmeye çalışıyordum -p. @ Moo'nun cevabı, yapamadığım şeylere ulaştı rm ./-p, bu da bir Google aramasından sonra birçok web sayfasında yaygın olarak mevcuttu.

Başka bir yöntem inode numarasını kullanmaktır. Burada açıklanan yöntemi kullandım:

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

Kısacası, aşağıdaki komutları kullanın:

  1. Dosya veya dizin inode numarasını görüntülemek için.
ls -il
  1. Bir dosya veya dizin için bağımsız değişkeni findkullanarak komutu kullanın .-exec rm -irf-exec rm -ifdr
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

-fBayrağını kullandığınızdan emin olun , aksi takdirde bash dizini veya dosyayı bulamamaktan şikayet eder.

Test tarihi:

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

1
Bu, baumgart'ın 10 yıl önceki cevabının neredeyse kopyasıdır, ancak çağrılırken rm -dhiç ve genellikle gerekmez , ancak bir dizine ihtiyacınız vardır ve bir dosya için buna ihtiyacınız yoktur . Düzeltildiğinde bile bu yöntem hala beceriksiz ve aşağılıktır. Boş olmayan bir dizin için sadece - bir dizin için r ve izin ayarlarına bağlı olarak f. -ffind-rrm -fr ./-p
dave_thompson_085

1
Önceki cevaplarda her iki yöntemden de bahsedilmişti.
RalfFriedl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.