Использование параметров в скрипте

Обычно я использую команду find для автоматической копирования определенных мультимедийных файлов из каталога A в каталог B. Я использую следующую команду:

for f in `find ./ -name "*.mkv" -mtime -24h`; do cp $f rename/ ; done 

Это полностью делает то, что я хочу, но теперь, когда я передал команду в исполняемый скрипт (назовем его mmcopy , он отлично работает). Интересно, могу ли я улучшить скрипт, чтобы сделать следующее:

Когда я mmcopy в командной строке, я хотел бы проанализировать два оператора / переменных для скрипта, а именно переменную расширения файла и переменную для оператора mtime, поэтому я могу указать, какие файлы должны быть скопированы и как старые эти файлы могут быть.

Например: я хочу автоматически копировать (все) .jpg файлы в каталоге, новее чем 3 дня, mmcopy jpg -3d должна выглядеть как mmcopy jpg -3d

Как мне изменить сценарий, чтобы иметь возможность?

  • Одно из нескольких перенаправлений с файлом-добавлением «python -version» повторяется «игнорируется» bash, но остальные не закрыты]
  • Есть ли способ, которым я могу поместить это в свой ~ / .bashrc как функцию?
  • Скопируйте всю папку из источника в пункт назначения и удалите дополнительные файлы или папку из пункта назначения
  • Почему я не получаю сообщение, которое не соответствует, когда я запускаю этот скрипт?
  • Как удалить привилегии root в сценариях оболочки?
  • Глобальная переменная для каждого скрипта
  • Замена Bash Combine и экстракция субструн за один шаг
  • Использование одной команды для определения скорости NIC
  • One Solution collect form web for “Использование параметров в скрипте”

    Во-первых, ваш текущий скрипт разбивается на имена файлов, содержащие пробелы и другие специальные символы. Это очень легко исправить: всегда используйте двойные кавычки вокруг подстановок переменных и используйте -exec вместо разбора вывода find . См. Почему мой сценарий оболочки задыхается от пробелов или других специальных символов? Чтобы получить больше информации.

     find . -name "*.mkv" -mtime -24h -exec cp {} rename/ \; 

    Аргументы, переданные вашему скрипту, доступны в специальных параметрах $1 , $2 и т. Д. Вот сценарий, который копирует файлы, расширение которых является первым параметром скрипта и чье сопоставление временной метки задается вторым параметром.

     #!/bin/sh find . -name "*.$1" -mtime "$2" -exec cp {} rename/ \; 

    Если вы хотите принять значения по умолчанию, если аргументы отсутствуют, вы можете использовать конструкцию расширения параметра ${…:-…} .

     #!/bin/sh find . -name "*.${1:-mkv}" -mtime "${2:--1d}" -exec cp {} rename/ \; 

    Я рекомендую заменить cp на cp -p или rsync -a . cp -p сохраняет метку времени в файле, что упрощает ее передачу, когда вы уже скопировали файл. rsync -a дополнительно не копирует файл, если он уже скопирован (если исходный файл не имеет другую временную метку или размер).

    Linux и Unix - лучшая ОС в мире.