Удалите весь *.mp4 и *.zip, но некоторые файлы

Похож на некоторые хорошие ответы, уже доступны, но вот другое использование tr и sed:

#!/bin/bash

for file in *; do
    newname=$(echo $file | tr '.' '_' | sed 's/\(.*\)_\([^_]*\)$/\1.\2/g')
    [ "$newname" != "$file" ] && mv "$file" "$newname"
done
1
15.11.2013, 14:23
3 ответа

Шаблон !("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 {} + вместо этого.

1
27.01.2020, 23:39

Существует несколько путей:

  • Используйте находят (портативный, поскольку этому не нужна определенная оболочка [удар]),
find . -maxdepth 1 ! -name "exclude" -delete

или в случае, если у Вас есть несколько шаблонов:

find . -maxdepth 1 ! \( -name "exclude" -o -name "exclude2" \) -exec rm -f {} \+
  • Используйте переменную GLOBIGNORE (колотите только),
export GLOBIGNORE=exclude:exclude1:mask*

Это исключит упомянутые файлы и маски от globing. После этого можно указать rm your_pattern

Можно попробовать его прежде ls

1
27.01.2020, 23:39
  • 1
    , пропускающий закрывающую скобку –  jirib 15.11.2013, 12:01
  • 2
    GNUism. Будьте более общими и используйте или 'исполнительную комнату' или 'xargs комната'.Спасибо. –  jirib 15.11.2013, 12:03
  • 3
    я пробую его прямо сейчас, но это кажется им, найдет все файлы, но thoses, который я исключаю, в чем я нуждаюсь, должен найти весь .mp4 и .zip, но thoses я хочу исключить. –  DrakaSAN 15.11.2013, 12:36
  • 4
    Для находки, где, как предполагается, )? (несколько шаблонов) –  DrakaSAN 15.11.2013, 12:39
  • 5
    @DrakaSAN можно использовать что-то как find . -name *.ext ! -name 1.ext –  rush 15.11.2013, 13:59

Я был бы Вы находить. Однако Вашей проблемой являются пробелы.

rm /path/to/directory/!("file1" | "file2")

совпадает с rm "/path/to/directory/!(file1" "|" "file2)"

нет rm "/path/to/directory/!(file1|file2)"

читайте на правилах заключения в кавычки оболочки.

0
27.01.2020, 23:39

Теги

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