Символы подстановки (например, *
) расширяются в список совпадающих имен файлов только тогда, когда они не в кавычках. Можно было бы оставить $2
без кавычек в функции:
archive() { tar cjf "`(date '+%Y.%m.%d-%Hh%Mm%Ss')`-$1.tar.bz2" $2; }
... но это может иметь некоторые неприятные последствия. Очевидно, что если вы пытаетесь заархивировать папку с пробелами или другими метасимволами в имени в имени, это может привести к путанице, потому что эти тоже не в кавычках.
A гораздо лучшее решение - передать шаблон папка + без кавычек, чтобы он расширялся до вызова функции. Вы запускаете
archive dev dev/*
... и оболочка расширяет его до чего-то вроде
archive dev dev/file1 dev/file2 dev/file3
Но тогда вам нужно написать функцию, чтобы она не просто архивировала $2
, но все аргументы начинаются с $2
. Это не так уж сложно; просто запишите $1
, используйте shift
, чтобы удалить его из списка аргументов, затем используйте "$@"
, чтобы получить все оставшиеся аргументы. И до тех пор, пока мы используем локальные переменные, я бы поставил целевое имя файла в одну (просто для общей аккуратности):
archive() {
local name_dest="$1"
local archive_name="$(date '+%Y.%m.%d-%Hh%Mm%Ss')-${name_dest}.tar.bz2"
shift
tar cjf "${archive_name}" "$@"
}