Удалить все файлы с расширением '.sh', но сохранить один файл с расширением через терминал [дубликат]

На самом деле это слишком большая просьба, я думаю.

Но я хочу удалить все файлы с расширением ".sh" (только из текущей папки), что я могу сделать с помощью следующей команды:

find . -maxdepth 1 -type f -name '*.sh' -exec rm {} +

Но все же я хочу сохранить файл "cron.sh" в текущей папке незатронутым.

Как я могу добиться этого в одной командной строке?

3
задан 20 October 2016 в 15:14

2 ответа

Можно использовать -not:

find . -maxdepth 1 -type f -name '*.sh' -not -name cron.sh -delete

кроме того, GNU find имеет -delete опция, которая более проста использовать и, чем rm -rf.

Важный : Всегда помещаемый -delete в конце. Как объяснено в man find:

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

<час>

, С другой стороны, Вы могли использовать цикл оболочки (но сделать не, эти find, команда выше намного более эффективна):

for f in *.sh; do [ "$f" = "cron.sh" ] || rm "$f"; done
5
ответ дан 1 December 2019 в 15:23

Альтернатива, но более медленный путь затем великое find пример terdon должен использовать mv и rm команды, объединенные в цепочку с и операторы.

mv cron.sh cron.sh.safe && rm *.sh && mv cron.sh.safe cron.sh

Это будет жаловаться, имеете ли Вы какие-либо каталоги, названные something.sh, но не удалите их.

1
ответ дан 1 December 2019 в 15:23

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

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