Відповіді:
Замість того щоб використовувати гт, може бути простіше використовувати знахідку . Така команда видалить усе, крім файлу, названого саме "файл"
find . \! -name 'file' -delete
Багато версій файлів повинні підтримувати глобальну та регулярну відповідність виразів.
Ви також можете передати висновок знаходження в rm
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
, а також які файли будуть збережені шляхом видалення -delete
та \!
.
find
рекурсивно! тому всі підкаталоги файлів, що не відповідають " шаблону ", також будуть видалені
Використання zsh, with setopt EXTENDED_GLOB
, використання ~
оператора ( крім )
rm -- *~(x|y|z)
або ^
оператор (заперечення):
rm -- ^(x|y|z)
Але, ймовірно, слід замість цього перемістити файли в інше місце, а потім видалити все. Це набагато безпечніше з точки зору ковзання пальців, наприклад, натискання клавіш занадто рано.
Пізніші версії bash мають extglob
опцію оболонки, яка дає вам синтаксис для того, щоб робити те, що ви хочете (перегляньте свою сторінку man у розділі "Розширення імені Pathname", щоб побачити, чи є у вашій встановленій версії):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Для тестування, я пропоную вам спочатку замінити rm
з , echo
щоб побачити , якщо список файлів , які будуть видалені , це те , що ви очікуєте.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Увага: Запустіть команду, і якщо файли, які потрібно видалити, є правильними, запустіть її ще раз та видаліть хеш-символ "#".
Якщо назви файлів складніші, то зробіть це
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Знову ж таки, спочатку подивіться на результати, а потім видаліть хеш-знак.
Ця версія - як пропонується в коментарях - зберігає деякі символи і виглядає дещо чіткіше.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
і a b
перша програма буде видалена - якщо ви введете ab в grep-частину: "^[ab]$"
a
та b
ні a b
, просто проти ваших намірів. Друга команда зробить те саме. І третя теж. Не слід використовувати 'ls' у скриптах, за дуже-дуже рідкісними винятками. Просто не роби цього.
Перемістіть файли, які ви хочете зберегти. Перейдіть на один рівень, видаліть папку. Відновіть папку та перемістіть ці файли назад.
/
, так? Не дуже практично. c) Спроба видалити всі файли з вашого $HOME
також не є практичною.
Це те, що я налаштував як .sh скрипт для гачка виходу з OSX / MacOS, працює досить добре.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
З GNU-find ви можете використовувати перемикач -delete, який також видаляє каталоги, якщо вони також порожні:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
це один із способів обійти це.
tmp
також, якщо в ньому не було файлів X
/ Y
/ Z
. Зазначимо !
як стандартний еквівалент GNU -not
(-delete
також є розширенням GNU)