Назад | Перейти на главную страницу

Как мне удалить имена путей из файлов, которые я заархивировал .. UBUNTU

Мне было поручено заархивировать определенные файлы в новый каталог на /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