Почему эти две команды rm выдают разные выходные данные?

#bash #unix

#bash #unix

Вопрос:

В первой команде корневой каталог, т. е. te , Не удаляется. Во второй команде я пытаюсь добавить исключение, чтобы не удалять файлы типа .log , который в конечном итоге уничтожает исходный каталог. Почему эти команды отличаются и как правильно добавить исключение без удаления исходного каталога?

 user:~/mnt/test$ rm -rf te/*
user:~/mnt/test$ ls
no.tar  te
user:~/mnt/test$ rm -rf te/* !(*.log)
user:~/mnt/test$ ls
no.tar
 

Комментарии:

1. Да, все, что находится под te/, должно быть удалено (каталоги, файлы и скрытые файлы), но не сам te/ и не любой файл с этим расширением .log . Для простоты давайте предположим, что файлы .log будут находиться только непосредственно под te/, а не в каких-либо его подкаталогах.

Ответ №1:

Шаблон !(*.log) extglob также соответствует каталогу te , поскольку его имя не заканчивается .log . Чтобы удалить все файлы, находящиеся в te , кроме файлов с расширением log , вы должны сделать:

 shopt -s dotglob    # match hidden files too
echo rm -rf te/!(*.log)
 

Отбросьте echo , если вы довольны результатом.