Удалите Все .log файлы execept для одного

Я хочу удалить все файлы с .log расширение на за исключением одного. Действительно ли возможно сделать, которые удаляют все .log файлы от всех папок за исключением mongodb файлов журнала?

3
задан 26 December 2019 в 14:11

2 ответа

Можно использовать find команда, но быть осторожными при использовании ее - Вы могли бы закончить тем, что удалили все, что Вы имеете.

  • Важный: Первый необходимо выполнить команду без -delete опция удостовериться, что вывод - то, что Вы хотите удалить. Заметьте, что -name ищет точное имя файла.

    $ find -not -name mongodb.log -name "*.log"
    
  • , Если вывод является надлежащим и Вы уверены, что команда определяет местоположение только файлов, которые мы хотим удалить, затем необходимо добавить -delete опция в конец команды.

    $ find -not -name mongodb.log -name "*.log" -delete
    

    порядок опций для [1 110] является значительным, и в этом случае если -delete опция будет помещена куда-нибудь кроме конца команды то - это удалит все.

Пример

Предполагает, что у нас есть эти файлы:

$ ls
1.log  2.log  3.log  4.log  5.log  bar  foo  mongodb.log

Позволяют нам перечислить весь *.log, исключая [1 113]. Проверьте вывод и удостоверьтесь, что он не содержит ничего кроме [1 114] файлы.

$ find -not -iname mongodb.log -name "*.log"
  • Уведомление -iname! сохранять и верхние и строчные версии [1 116].

Затем удаляют их использование:

$ find -not -iname mongodb.log -name "*.log" -delete

Проверка снова и Вы будете видеть, что файлов журнала не стало как ожидалось, но mongodb.log остается там.

$ ls
bar  foo  mongodb.log
5
ответ дан 26 December 2019 в 22:26

Для удаления всех файлов кроме того, названного mongodb.log, можно использовать расширенный globbing. Во-первых, включите опцию:

shopt -s extglob

И затем, можно работать:

rm !(mongodb.log)

Или, для удаления только файлов с .log расширение, но не mongodb.log, можно сделать:

rm !(mongodb).log

, Например:

$ ls
file1  file2  file3.log  file4.log  file5.log  mongodb.log
$ rm !(mongodb).log
$ ls
file1  file2  mongodb.log

при необходимости в этом, чтобы быть рекурсивными, соответствовать файлам в подкаталогах также, можно использовать globstar опция:

shopt -s globstar

И затем выполненный:

rm **/!(mongodb).log

, Например:

$ tree
.
├── bar
│   └── baz
│       └── bad
│           ├── file1
│           ├── file2
│           ├── file3.log
│           ├── file4.log
│           ├── file5.log
│           └── mongodb.log
├── file1
├── file2
├── file3.log
├── file4.log
├── file5.log
└── mongodb.log

$ rm **/!(mongodb).log

$ tree
.
├── bar
│   └── baz
│       └── bad
│           ├── file1
│           ├── file2
│           └── mongodb.log
├── file1
├── file2
└── mongodb.log

3 directories, 6 files
<час>

От [1 112]:

, Если опция оболочки extglob включена с помощью shopt встроенного, несколько расширенных операторов сопоставления с образцом распознаны. В следующем описании список шаблона является списком одного или нескольких шаблонов, разделенных | . Составные шаблоны могут быть сформированы с помощью одного или нескольких fol‐ подшаблонов мычания:

      ?(pattern-list)
             Matches zero or one occurrence of the given patterns
      *(pattern-list)
             Matches zero or more occurrences of the given patterns
      +(pattern-list)
             Matches one or more occurrences of the given patterns
      @(pattern-list)
             Matches one of the given patterns
      !(pattern-list)
             Matches anything except one of the given patterns

 

globstar

, Если установлено, шаблон ** используемый в контексте расширения пути будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если шаблон сопровождается/, только соответствие подкаталогов и каталоги.

1
ответ дан 26 December 2019 в 22:26

Другие вопросы по тегам:

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