Мне было поручено заархивировать определенные файлы в новый каталог на /home/archive/
.
Я использовал эту команду:
mkdir /home/archive
cd /home/archive
tar -cvf log.tar \
/var/log/auth.log /var/log/alternatives/log \
/var/log/bootstrap.log /var/log/cron.log \
/var/log/dpkg.log /var/log/kern.log /var/log/mail.log
Извините за длинную командную строку, но мне нужны только эти файлы из всего каталога / var / log.
У меня проблема в том, что, когда я выполняю длинную команду, как указано выше, она работает, но показывает весь путь к файлу, когда я выполняю less log.tar
(чтобы просмотреть содержимое без извлечения).
Я хочу, чтобы он отображал это:
alternatives.log
auth.log
bootstrap.log
cron.log
dpkg.log
kern.log
mail.log
Вместо этого перед именем файла указывается путь / var / log. Извините, если вам сложно читать все это, но я был бы очень признателен за помощь!
Это упражнение с регулярными выражениями путем удаления относительных путей к файлам из вывода списка файлов tar.
Начните с создания tar-архива и перечислите полные пути к папкам:
tar -cf archive.tar /path1/to/folder1 /path2/to/folder2 /path3/to/folderN
Затем скажите tar показывать только вывод пути. Передайте его вывод как stdout в grep как stdin. Показать окончательный результат только с именами файлов:
tar -tf archive.tar | grep -o [^/]*$
Держите две операции отдельно. Эта команда grep:
grep -oP [^/]*$
может быть применен к любому stdout или текстовому файлу, заканчивающему строку путями к именам файлов. Лучше ограничиться только этим. tar -tf archive.tar выводит пути к именам файлов и хорошо подходит для формата grep выше. Его результат выглядит так:
/path/to/folder1/filename1(newline)
/path/to/folder2/filename2(newline)
/path/to/folderN/filenameN(newline)
Разбивка на части: [^ /] * $ = найти последнюю косую черту в строке. Вернуть ноль или более символов от этой точки (исключая косую черту) до конца строки.
tar
запишет пути к указанным вами файлам. Я не совсем уверен, почему это проблема?
Если вы просто хотите удалить путь при отображении файлов, вы можете выполнить tar tf /home/archive/log.tar | sed 's,.*/,,'
Это не изменит файл, поэтому кто-то делает tar tf /home/archive/log.tar
или less /home/archive/log.tar
по-прежнему будет видеть пути.
Вы хотите изменить tar-файл? Первая проблема, tar
файлы не предназначены для модификации, изменение одного из них, по сути, распаковывает его, изменяет то, что вы хотите, и задерживает его. Полагаю, что перепаковывать с оригиналов можно.
Вторая проблема, возможно, у вас опечатка. Вы действительно сохраняете / var / log / alternatives / log, когда пишете в своей команде, или /var/log/alternatives.log, как хотите, в выводе? Я предполагаю второе.
Если так,
cd /var/log && tar cf /home/archive/log.tar \
auth.log alternatives.log bootstrap.log \
cron.log dpkg.log kern.log mail.log
или
tar cf /home/archive/log.tar \
auth.log alternatives.log bootstrap.log \
cron.log dpkg.log kern.log mail.log \
-C /var/log
должен делать это красиво.
Если вы действительно хотите изменить имеющийся у вас tar-файл, убедитесь, что у вас достаточно места в /home
(как я это сделал, вам понадобится место для еще двух файлов) и выполните
cd /home/archive
mv -i log.tar log_with_paths.tar
tar xf log_with_paths.tar
cd var/log
tar cf /home/archive/log.tar *
cd /home/archive
rm -r /home/archive/var
tar tf log.tar
Я бы следовал инструкциям, приведенным здесь: https://stackoverflow.com/a/18681628/10693721
tar -cjf site1.tar.bz2 -C /var/www/site1
tar -cvf log.tar -C /var/log/auth.log /var/log/alternatives/log /var/log/bootstrap.log /var/log/cron.log /var/log/dpkg.log /var/log/kern.log /var/log/mail.log
Быстрое решение - запустить вашу команду иначе. Запустите его из / var / log.
cd /var/log
tar -cvf /home/archive.log.tar \
auth.log alternatives/log bootstrap.log cron.log \
dpkg.log kern.log mail.log
cd /home/archive