Найдите для списка всех файлов с шаблоном даты, чтобы смолить их вместе

Определения:

${string%substring} удаляет самое короткое соответствие $substring от конца $string.

${string##substring} удаляет самое долгое соответствие $substring от запуска $string.

Ваш пример:

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})

${0%/*} удаляет все после последней наклонной черты, давая Вам имя каталога сценария (который мог бы быть относительным путем).

${0##*/} удаляет все до последней наклонной черты, давая Вам просто название сценария.

Так, эта команда изменяется на каталог сценария и связывает текущий рабочий каталог (данный $PWD) и название сценария, дающего Вам полный путь.

Для наблюдения, что идет на попытку:

echo ${0%/*}
echo ${0##*/}
2
29.10.2016, 15:56
3 ответа

Регулярное выражение Вы использовали с 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* с любой из вышеупомянутых команд.

5
27.01.2020, 21:55

Что-то как

for file in acct.201110[0-9]; do tar -cvjf $file.bz2 $file; done

должен работать (возможно, с лучшим шариком для ловли всех дней), но проблема походит logrotate или Newsyslog - то, в чем Вы могли нуждаться.

1
27.01.2020, 21:55

Инструмент, который Вы хотите для этого, является cpio (1). Это возьмет список файлов от stdin и произведет архив. Если необходимо произвести архив в формате tar, используйте -H tar опция.

0
27.01.2020, 21:55
  • 1
    Это не что OP, относительно которого попросили. Он попросил команду сжимать каждый файл отдельно. –  rozcietrzewiacz 22.11.2011, 19:00
  • 2
    Если это так, я согласился бы с комментарием symcbean - почему не просто используют bzip2 непосредственно. –  ConcernedOfTunbridgeWells 22.11.2011, 20:34
  • 3
    Да, каждый может (это удалить исходные файлы по умолчанию), но это не показывает причину, почему команда OP не работала. –  rozcietrzewiacz 23.11.2011, 01:37
  • 4
    +1 с тех пор, как оказалось, кажется, что пользователь может намереваться сжать их всех в один архив. пользовательское намерение состоит в том, чтобы оставить свободное место. Кроме того, считайте это: rightsock.com/~kjw/Ramblings/tar_v_cpio.html –  djangofan 23.11.2011, 02:06

Теги

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