Я хочу удалить все файлы с .log
расширение на за исключением одного. Действительно ли возможно сделать, которые удаляют все .log
файлы от всех папок за исключением mongodb файлов журнала?
Можно использовать 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
Для удаления всех файлов кроме того, названного 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
, Если установлено, шаблон ** используемый в контексте расширения пути будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если шаблон сопровождается/, только соответствие подкаталогов и каталоги.