Как удалить все КРОМЕ нескольких файлов?

Я использовал хоббита, старший брат и nagios при работе на более плохой (читайте более дешевый), организации. Из трех я предпочитаю хоббита потому что его простое и пуленепробиваемое. Я всегда чувствовал, что nagios является попыткой, должна быть версия с открытым исходным кодом openview или Тиволи, и откровенно если у меня есть время для расходов конфигурирования платформы как openview, или Тиволи, затем контролирующий, является, вероятно, моим всем заданием, и моя организация может, вероятно, позволить себе купить openview, итак, почему использование nagios?

2
задан 17 August 2009 в 22:57
7 ответов

Во-первых, тест с:

найдите путь к папке-maxdepth 1!-iname 'excludeme' - и - тип f - должностное лицо ls "{}" \;

Затем:

найдите путь к папке-maxdepth 1!-iname 'excludeme' - и - тип f - исполнительная комната "{}" \;

- maxdepth 1 означает смотреть в текущей папке только (и это должна быть первая опция),

!-iname (или - имя) говорит для не включения чего-либо, что соответствует тому, что Вы хотите остаться.

- тип f удостоверяется, что Вы не получаете каталогов в текущей папке.

4
ответ дан 3 December 2019 в 08:45
  • 1
    хороший ответ, некоторые версии также имеют - удаляют флаг –  Andy 17 August 2009 в 23:36
  • 2
    По некоторым причинам, I' m всегда боящийся использования его. Я чувствую себя настолько больше комфортно с ls и затем заменой ls с комнатой, после того как я проверяю вывод, даже при том, что я мог сделать ту же самую вещь с - печать и - удаляет. –  David 18 August 2009 в 00:44
find . -maxdepth 1 -path ./folder -prune -o -exec rm -rf '{}' ';'

Обязательно проверьте его дважды сначала с некоторыми данными тестирования!

2
ответ дан 3 December 2019 в 08:45

Если нет никаких открытых файлов в foo, Вы могли просто переместить его, удалить все остальное и положить обратно его.

Я не думаю, что существует легкое "отрицательное" соответствие в bashglobbing, хотя Вы смогли производить использование того findregex и соответствия iregex.

править: просто мысль...

ls | grep -v ^./foo$

перечислит все файлы кроме нечто, таким образом, Вы могли использовать

ls | grep -v ^./foo$ | xargs rm

хотя это будет иметь проблемы, если какой-либо файл/имена каталогов будет содержать пробелы.
Можно измениться, regex передал grep по мере необходимости, если Вы хотите соответствовать шаблону, а не единственному файлу/каталогу, или пройти через grep больше раз:

ls | grep -v ^./foo$ | grep -v ^./bar$ | xargs rm -rf

Очень старайтесь протестировать вывод последовательности find+grep прежде, чем добавить xargs rm -rf шаг.

отредактируйте снова: ls делает то же как find . -maxdepth 1 и вероятно более просто.

1
ответ дан 3 December 2019 в 08:45
  • 1
    Хорошо также, если файлы открыты, и Вы перемещаете их в ту же файловую систему. Не хорошо, если программа пытается открыться, перемещенные файлы во время изменения (переименуйте, удалите, переименуйте назад). Если файлы открыты, точка дескриптора файла к inode - таким образом, это не имеет значения имя. –  Mircea Vutcovici 27 January 2010 в 15:56

Соответствовать всему кроме чего-то обычно упоминается как обратное соответствие. Развернуть имя файла - сама оболочка, Вы используете globbing. Если бы Вы собираетесь назвать программу за пределами оболочки, Вы, вероятно, хотели бы, находят, как люди упомянули.

Можно сделать обратное соответствие с более новым ударом при включении расширенного globbing. Например, для соответствия всему, что не имеет нечто или панели на имя:

shopt -s extglob
echo !(*foo*|*bar*)

Или просто все, что не имеет нечто:

shopt -s extglob
echo !(*foo*)
2
ответ дан 3 December 2019 в 08:45

Если бы это был маленький список, то я сделал бы что-то как:

ls-1|egrep-v" (file2|file8)" |xargs комната-rf

Который получает список файлов, затем держит для regex, исключая файлы, которые Вы хотите сохранить, и удаляет все остальное.

Необходимо ОПРЕДЕЛЕННО протестировать это, бросив xargs часть, чтобы проверить, что у Вас есть правильный набор файлов.

0
ответ дан 3 December 2019 в 08:45

Существует также более случайное решение, которое является:

  1. mkdir../временный файл
  2. precious1 precious2 precious3../temp/ln (или mv вместо ln)
  3. комната-rf *
  4. ln../временный файл /*.
  5. rmdir../временный файл

Недостаток - то, что Ваши драгоценные файлы на мгновение перемещены. Это решение не подошло бы, если Ваши драгоценные файлы должны быть доступными все время.

Однако этот метод имеет преимущество, которое можно проверить после шага 2, что драгоценные файлы безопасны. Это особенно значительно, если бы существуют скрытые файлы или включенные подкаталоги, который повысил бы возможности делания ошибки с другими методами, предложенными здесь.

0
ответ дан 3 December 2019 в 08:45

Версия для Windows cmd.exe

Распечатайте названия всех каталогов в C:\ кроме названных 'нечто':

@echo off
FOR /D %A IN (C:\*) DO (IF /I NOT "%A"=="C:\foo" (echo %A))

Распечатайте названия всех файлов в C:\ кроме названных 'нечто' (игнорирующий расширения файла):

@echo off
FOR %A IN (C:\*.*) DO (IF /I NOT "%~nA"=="foo" (echo %A))

Распечатайте названия всех файлов в C:\ кроме тех, которые имеют дополнительную 'панель':

@echo off
FOR %A IN (C:\*.*) DO (IF /I NOT "%~xA"==".bar" (echo %A))

Распечатайте названия всех файлов в C:\ кроме названных 'foo.bar':

@echo off
FOR %A IN (C:\*) DO (IF /I NOT "%~nxA"=="foo.bar" (echo %A))

Измените команду 'эха' на то, чем случается так, что Вы хотите сделать - например, 'del'

Все вышеупомянутое нечувствительно к регистру - удаляют '/I' для изменения этого.

Ввести 'для/?' для получения дополнительной информации о % FOR ~ синтаксис.

1
ответ дан 3 December 2019 в 08:45

Теги

Похожие вопросы