Я пытаюсь передать параметр rm в сценарии bash для автоматической очистки моей системы. Например, я хочу удалить все, кроме файлов * .doc. Итак, я написал следующие коды.

#!/bin/bash
remove_Target="!*.txt"
rm $remove_Target

Однако на выходе всегда говорится

rm: cannot remove ‘!*.txt’: No such file or directory

Очевидно, что сценарий bash добавляет для меня одинарные кавычки при передаче переменной в rm. Как удалить одинарные кавычки?

2
Jamie Chou 14 Май 2015 в 06:18

1 ответ

Лучший ответ

Использование Bash

Предположим, у нас есть каталог с тремя файлами

$ ls
a.py  b.py  c.doc

Чтобы удалить все, кроме *.doc:

$ shopt -s extglob
$ rm !(*.doc)
$ ls
c.doc

!(*.doc) - это расширенный объект оболочки, или extglob, который соответствует всем файлам, кроме тех, которые заканчиваются на .doc.

Для функции extglob требуется современный bash.

Используя find

Альтернативно:

find . -maxdepth 1 -type f ! -name '*.doc' -delete
3
John1024 14 Май 2015 в 09:00