Bazı dosyaları bash'daki dosya adı genişletme mekanizmasından nasıl dışlayabilirim?


14

Kök dizinde ubuntu dosya sistemi dizinleri var ve yanlışlıkla yüzlerce dosyayı kök dizine kopyaladım.

Sezgisel olarak kopyalanan dosyaları,

rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.

bu işe yaramıyor. Tüm dizini silerken bazı dizinleri hariç tutmanın doğru yolu nedir?

EDIT: Ne yapacağını bilmeden asla burada herhangi bir komut deneyin!


1
Hangi kabuğu kullanıyorsun? Dosya adı globbing, böyle süslü şeyler yapmak söz konusu olduğunda kabuğa bağımlıdır.
Kusalananda

2
Bir cevap değil, ama örneğin kullanacağım mc. İle her şeyi seçin *, ardından -veya Inserttuşuyla belirli dosyaların seçimini kaldırın .
pbm

1
'Mc'nin ne olduğunu açıklayabilir misiniz?
MikeP

@Kusalananda it's/bin/bash
kenn

3
@MikeP: mcNorton Commander'ın çok faydalı bir taklidi olan Midnight Commander. Bir terminalde çalışır. (Hem Midnight Commander hem de Norton Commander, ortodoks dosya yöneticisi olarak adlandırılanlara örnektir .)
AlexP

Yanıtlar:


21

Kullandığınız için bash:

shopt -s extglob
echo rm -rf ./!(bin|sbin|usr|...)

echoTüm sistemi patlatabilecek bir şey çalıştırdığınızda komut satırının başına eklemenizi öneririm . Sonuçtan memnunsanız kaldırın.

Not: Yukarıdaki komut gizli dosyaları (adı nokta ile başlayanlar) kaldırmaz. Bunları da kaldırmak istiyorsanız dotglobseçeneği de etkinleştirin :

shopt -s dotglob

Dosya sistemini başarıyla temizlemek için kullandım. İlk başta bir dizinde test ettim. Ben de rm -rf ./!(bin,sbin,..)virgülle ayrılmış denedim , ama tüm dizinleri kaldırır.
Kennedy

Bu !(...)sözdizimi nedir? Sezgisel olarak ls ./!(*/)sadece dosyaları listeleyeceğini düşündüm , ancak bu şekilde çalışmıyor.
giusti

@giusti Bu sözdizimi, dosya adı genişletme mekanizmasında genişletilmiş desen eşleşmesidir - açıklamasını Yol Adı Genişletme bölümündeki bash kılavuzunda bulabilirsiniz. Dosya türlerini hariç tutmak için kullanılamaz, yalnızca yıldızlarda *veya diğer globlarda olduğu gibi yalnızca adları .
jimmij

12

Bu komut aşağıdaki dizinleri içermez /:

find / -maxdepth 1 -type f

Saklamak istediğiniz hiçbir dosyanın bulunmadığından kesinlikle emin olduktan sonra şunları kullanabilirsiniz:

find / -maxdepth 1 -type f -delete

Daha güvenli, korumak istediğiniz bir şeyi silmediğinizden emin olmak için onları başka bir yere taşımak olacaktır:

mkdir /root/preserve
find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;

Dosyalarına ek olarak, aynı zamanda var ise dizinleri size dosya sisteminin köküne eklediğiniz için, bu olabilir otomatik LSB'den dizinleri hariç tutarak otomatik hale mvveya rmiçinde tasfiye şeylerle biz bu yana ediyoruz muamele, dürüst, fakat Dosya sisteminin kökü ise, mümkünse manuel olarak yapmayı düşünmenizi şiddetle tavsiye ederim.

Bu mümkün değilse, böyle bir şey hile yapabilir:

#!/bin/bash
declare -a excludes
for item in root sys 'lost+found' mnt home proc etc opt boot lib lib64 libx32 sbin media srv dev var usr bin tmp run; do
    excludes+=("$item")
done
if ! [[ -d /root/preserve ]]; then
    mkdir -p /root/preserve
fi
IFS="\n"
for item in find / -type d -maxdepth 1; do
    really=true
    for exclude in ${excludes[@]}; do
        if [[ "$exclude" == "${item#/}" ]]; then
            really=false
        fi
    done
    if [[ "true" == "$really" ]]; then
        mv -- "$item" /root/preserve/
    fi
done

Çığlık testini geçtikten sonra (yani sisteminiz hala çalışıyor ve acı içinde çığlık atmıyorsunuz), içeriğini kaldırabilirsiniz /root/preserve/.

Önemli not: Ne yaparsanız yapın, herhangi bir permütasyon çalıştırmayı düşünmeyin bile rm -fr [ANYTHING GOES HERE] /.


çözümünüz yalnızca dosyaları siler, ancak etrafında klasörler de vardır.
kenn

1
Bir çok kez, kötü amaçlardan kaynaklanan dehşet çığlıkları duydum rm. İle bir komut dosyası gibi rm -fr $somepath/olan somepatho başlatılmamış. Bunun ne kadar ciddi olduğunu ifade etmede daha ileri gidebilirdim, ama benim uyarımda aile dostu olmayı seçtim.
DopeGhoti

3

Bu işin yapılmasını sağlamalıdır (OP'nin istediği gibi olmasa da):

ls -1 >1.txt
pico 1.txt 

saklamak istediğiniz tüm dosyaları / dizinleri kaldırın

xargs rm < 1.txt

Dosyalarınızın tümü aynı ad biçimine, tarihe veya başka bir şeye sahipse, başka yöntemler de vardır.

Ben inodes bakmak istiyorum - ve ls -i | sort üzerinden sıralı olup olmadığını görmek ve eğer öyleyse, yeni dosyalar daha büyük inode sahip olacak. Daha sonra yukarıdakiyle aynı işlem türünü kullanarak ...

ls -iF1 | sort |cut -c10- | grep -vE "\/|\@" >i.txt   #This part removes entries that are not regular files, such as directories and links.  
pico i.txt
xargs rm < i.txt

yukarıdaki kesme komutunda, doğru miktar olduğundan emin olmak için önce inode listenizi kontrol edin.

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.