На этот вопрос уже есть ответ здесь:
На самом деле это слишком большая просьба, я думаю.
Но я хочу удалить все файлы с расширением ".sh" (только из текущей папки), что я могу сделать с помощью следующей команды:
find . -maxdepth 1 -type f -name '*.sh' -exec rm {} +
Но все же я хочу сохранить файл "cron.sh" в текущей папке незатронутым.
Как я могу добиться этого в одной командной строке?
Можно использовать -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
Альтернатива, но более медленный путь затем великое find
пример terdon должен использовать mv
и rm
команды, объединенные в цепочку с и операторы.
mv cron.sh cron.sh.safe && rm *.sh && mv cron.sh.safe cron.sh
Это будет жаловаться, имеете ли Вы какие-либо каталоги, названные something.sh, но не удалите их.