Удалить файлы, которые не называются «today.md» [дубликат]

На машине Linux, к которой у меня есть доступ, apt edit-sources откроет редактор с текущим ] sources.list для редактирования. Когда редактор закрывается, перед заменой старого списка выполняются некоторые базовые проверки работоспособности отредактированного списка.

Это файл конфигурации, который apt использует для выборки пакетов.

Вы можете просмотреть руководство для sources.list перед его редактированием ( man sources.list ).

Файл обычно находится в / etc / apt / .

7
31.10.2018, 01:50
5 ответов

Использовать отрицательное совпадение (требует shopt -s extglob, но, возможно, уже установлено):

rm !(today).md

(вы можете сначала использовать lsвместо rmдля проверки результата ).

Много силы в extglob, вы также можете

rm !(yesterday|today).md

если вы хотите сэкономить два файла.

19
27.01.2020, 20:13

Возможно, вам будет проще использовать расширенную функцию подстановки в bash , чтобы исключить файл, который вам не нужен:

shopt -s extglob
echo rm -- !(today).md

Вышеупомянутый (после удаления echoдля тестирования )говорит, что соответствует чему-либо, кроме today, за которым следует .md.

По умолчанию ваш пример не соответствует файлам с точкой -; вы можете изменить это поведение с помощью shopt dotglob, при желании

Ваш скрипт не работал так, как написано, потому что шаблон глобуса, который вы использовали (надлежащим образом )префикс имени файла ./; следовательно, ваш внутренний тест должен был сравниться с ./today.md.

3
27.01.2020, 20:13

Приведенные выше решения являются лучшими, но ваш код не работает из-за сравнения.

"./today.md" не равно "today.md".

9
27.01.2020, 20:13

Unix славится наличием множества способов выполнения одних и тех же простых задач. Некоторым нравится использовать sed, но мне нравится grep, поэтому, если бы я просто печатал в командной строке, я бы использовал:

rm -i `ls *.md | grep -v '^today.md$'`
  1. ls *.mdперечисляет все файлы, имена которых заканчиваются на .md.
  2. |передает результаты lsв следующую команду, но в качестве побочного эффекта приводит к тому, что lsвыводит список файлов на несколько строк, по 1 в строке.
  3. grep -v '^today.md$'повторяет неточно совпадающие строкиtoday.md
  4. rm -iзатем берет результаты (, потому что команды находятся внутри обратных кавычек ), которые спрашивают вас, хотите ли вы удалить их, 1 за 1. Я всегда делаю это, когда использую сгенерированный список файлов, на случай, если что-то выходит из строя генератор. Вы можете использовать rmбез -i, чтобы удалить файлы без запроса, но это более рискованно, а также не дает вам список файлов, которые были удалены.
-1
27.01.2020, 20:13

find. -maxdepth 1 -name '*.md' ! -name today.md -type f -print

Должен найти все файлы(-type f)в текущем каталоге(.--или явно поместить туда имя каталога )только(-maxdepth 1предотвращает следующие подкаталоги ), которые заканчиваются на .md(-name '*.md'), за исключением(!)​​файл today.md.

Не забудьте заключить '*.md'в одинарные кавычки, чтобы ваша оболочка не пыталась расширить это до списка файлов.md в текущем каталоге перед выполнением find.

Будет напечатан список файлов, которые необходимо удалить. Вместо этого измените -printна -delete, чтобы удалить их.

12
27.01.2020, 20:13

Теги

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