Як виключити деякі файли з механізму розширення імені файлів у bash?


14

У мене в кореневому каталозі є каталоги файлової системи ubuntu, і я випадково скопіював сотні файлів у кореневий каталог.

Я інтуїтивно намагався видалити скопійовані файли, виключивши файлову систему типу

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

бо це не працює. Який правильний спосіб виключити деякі каталоги при видаленні цілого?

EDIT: Ніколи не пробуйте жодної команди тут, не знаючи, що робити!


1
Яку оболонку ви використовуєте? Глобулювання імен файлів залежить від оболонки, коли мова йде про подібні фантазії.
Kusalananda

2
Не відповідь, але я б використав, наприклад mc. Виберіть усе з *, а потім зніміть виділення конкретних файлів за допомогою -або Insertклавішу.
пбм

1
Чи можете ви пояснити, що таке 'mc'?
MikeP

@Kusalananda це/bin/bash
kenn

3
@MikeP: mcце північний командир, дуже корисна імітація командира Нортона. Він працює в терміналі. (І «Опівночний командир», і «Нортон командир» є прикладами того, що називається ортодоксальним файловим менеджером .)
AlexP

Відповіді:


21

Оскільки ви використовуєте bash:

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

Я рекомендую додати echoна початку командного рядка, коли ви запускаєте щось, що потенційно може підірвати всю систему. Видаліть його, якщо ви задоволені результатом.

Примітка. Наведена вище команда не видалить приховані файли (ті, назва яких починається крапкою). Якщо ви хочете їх також видалити, активуйте також dotglobопцію:

shopt -s dotglob

Я використовував його для успішного очищення файлової системи. Спочатку я перевірив це в каталозі. Я також спробував rm -rf ./!(bin,sbin,..)розділити кому, але вона видаляє всі каталоги.
kenn

Що це за !(...)синтаксис? З прикладу, який я інтуїтивно думав, ls ./!(*/)буде перераховано лише файли, але це не працює таким чином.
giusti

@giusti Цей синтаксис є розширеним узгодженням шаблону в механізмі розширення імені файлів - його опис ви знайдете в посібнику з bash в розділі Розширення Pathname. Його не можна використовувати для вилучення типів файлів, лише імен, як і зірочка *чи інші кулі.
jimmij

12

Ця команда покаже всі не-каталоги в /:

find / -maxdepth 1 -type f

Коли ви абсолютно впевнені, що файлів немає, які ви хочете зберегти, ви можете використовувати:

find / -maxdepth 1 -type f -delete

Безпечніше - перенести їх в інше місце, щоб не видалити щось, що ви хочете зберегти:

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

Якщо крім файлів у вас є також каталоги, які ви додали до кореня файлової системи, це можна автоматизувати, виключивши каталоги LSB з автоматизованих, mvабо rm, якщо чесно, оскільки ми маємо справу з очищенням речей у Корінь файлової системи, я настійно пропоную вам розглянути це вручну, якщо це взагалі можливо.

Якщо це неможливо, щось подібне може зробити трюк:

#!/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

Після того, як ви пройшли тест на крик (тобто ваша система все ще працює і ви не кричите від туги), ви можете видалити вміст /root/preserve/.

Важлива примітка: Що б ви не робили, навіть не думайте про запуск перестановки rm -fr [ANYTHING GOES HERE] /.


ваше рішення видаляє лише файли, але навколо також є папки.
kenn

1
Занадто багато разів я чув крики невдоволення від погано націленого rm. Як сценарій rm -fr $somepath/з somepathнеініціалізованими в ньому. Я міг би піти далі, висловивши, наскільки це серйозно, але я вирішив залишатися сімейним у своїх запереченнях.
DopeGhoti

3

Це має зробити роботу (хоча не так, як просить ОП):

ls -1 >1.txt
pico 1.txt 

видаліть усі файли / каталоги, які ви хочете зберегти

xargs rm < 1.txt

Якщо всі ваші файли мають однаковий формат імені, дату чи щось інше, існують інші методи.

Я погляну на вставки - і побачу, чи вони послідовні через ls -i | сортування, і якщо вони є, то нові файли матимуть більші вставки. Потім використовуючи той же тип процесу, що і вище ...

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

у команді "cut" ("Вирізати") спочатку перевірте свій список індексів, щоб переконатися, що це потрібна сума.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.