Похож на некоторые хорошие ответы, уже доступны, но вот другое использование tr
и sed
:
#!/bin/bash
for file in *; do
newname=$(echo $file | tr '.' '_' | sed 's/\(.*\)_\([^_]*\)$/\1.\2/g')
[ "$newname" != "$file" ] && mv "$file" "$newname"
done
Шаблон !("file1" | "file2")
соответствия любой файл кроме file1␣
или ␣file2
где ␣
пространство. Путем Вы заключили его в кавычки, вводит в заблуждение: это эквивалентно !(file1 | file2)
или !("file1 "|" file2
)`.
Нет никакого пути в ударе для объединения отрицательного шаблона с положительным шаблоном для высказывания “всех относительно них за исключением тех”. В zsh можно записать
setopt extended_glob
rm /path/to/directory/*.(mp4|zip)~(keep*|1234.zip)
удалить this.mp4
и that.zip
но нет keep-this.mp4
или 1234.zip
.
В ударе можно установить GLOBIGNORE
переменная для исключения определенных шаблонов из всех соответствий.
shopt -s extglob
GLOBIGNORE='keep*:1234.zip'
rm /path/to/directory/*.(mp4|zip)
unset GLOBIGNORE
С другой стороны, можно использовать find
, который позволяет Вам создать произвольно сложные булевы выражения.
find /path/to/directory \( -name '*.mp4' -o -name '*.zip' \) ! -name 'keep*' ! -name '1234.zip' -delete
Отметьте это find
рекурсивно вызывает в подкаталоги. Если это не желаемо, добавить -maxdepth 1
после /path/to/directory
.
Если Ваш find
не понимает -maxdepth
(это распространено, но не стандартно), использовать -type d -prune -o
вместо этого. Если Ваш find
не понимает -delete
(тот же комментарий), использовать -exec rm {} +
вместо этого.
Существует несколько путей:
find . -maxdepth 1 ! -name "exclude" -delete
или в случае, если у Вас есть несколько шаблонов:
find . -maxdepth 1 ! \( -name "exclude" -o -name "exclude2" \) -exec rm -f {} \+
export GLOBIGNORE=exclude:exclude1:mask*
Это исключит упомянутые файлы и маски от globing. После этого можно указать rm your_pattern
Можно попробовать его прежде ls
Я был бы Вы находить. Однако Вашей проблемой являются пробелы.
rm /path/to/directory/!("file1" | "file2")
совпадает с rm "/path/to/directory/!(file1" "|" "file2)"
нет rm "/path/to/directory/!(file1|file2)"
читайте на правилах заключения в кавычки оболочки.