Определения:
${string%substring}
удаляет самое короткое соответствие $substring
от конца $string
.
${string##substring}
удаляет самое долгое соответствие $substring
от запуска $string
.
Ваш пример:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
${0%/*}
удаляет все после последней наклонной черты, давая Вам имя каталога сценария (который мог бы быть относительным путем).
${0##*/}
удаляет все до последней наклонной черты, давая Вам просто название сценария.
Так, эта команда изменяется на каталог сценария и связывает текущий рабочий каталог (данный $PWD
) и название сценария, дающего Вам полный путь.
Для наблюдения, что идет на попытку:
echo ${0%/*}
echo ${0##*/}
Регулярное выражение Вы использовали с find
не соответствует всем файлам в диапазоне acct.20111001
кому: acct.20111030
, потому что Вы забыли о последней цифре. Если для Вас нормально соответствовать также acct.20111000
(в случае, если это существует, который я сомневаюсь относительно оценки от вида даты имен), можно использовать
find /home/log/2011/10 -name "acct.201110[0-3][0-9]" -exec tar -cvjf {}.bz2 {} \;
Другая опция, особенно когда у Вас есть немного файлов для работы на (меньше чем сотни) не состоит в том, чтобы использовать find
, но простое for
цикл вместо этого. Можно затем использовать выражение диапазона, которое приводит к списку дополненных нулем чисел:
for file in acct.201110{01..30}; do tar -cvjf $file.bz2 $file; done
Еще один вариант возможен если acct.20111001
через acct.20111030
единственные файлы, которые начинаются acct.201110
(который, снова, я подозреваю для имения место) - затем можно просто использовать acct.201110*
с любой из вышеупомянутых команд.
Инструмент, который Вы хотите для этого, является cpio (1). Это возьмет список файлов от stdin и произведет архив. Если необходимо произвести архив в формате tar, используйте -H tar
опция.