web-dev-qa-db-ja.com

アーカイブしたファイルからパス名を削除するにはどうすればよいですか。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ディレクトリ全体のファイルだけです。

私が抱えている問題は、上記のようにlongコマンドを実行すると機能しますが、less log.tar(まだ抽出せずにコンテンツを表示するため)を実行するとファイルパス全体が表示されることです。

これを表示したい:

alternatives.log 
auth.log 
bootstrap.log 
cron.log 
dpkg.log 
kern.log 
mail.log 

代わりに、ファイル名の前に/ var/logパスがあります。これをすべて読むのが混乱している場合は申し訳ありませんが、助けていただければ幸いです。

1
hxx07

簡単な解決策は、コマンドを別の方法で実行することです。/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
1
Zoredache

私はここに与えられた指示に従います: 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
1

tarは、指定したファイルのパスを記録します。なぜそれが問題なのかよくわかりませんか?

ファイルを表示するときにパスを削除したいだけの場合は、tar tf /home/archive/log.tar | sed 's,.*/,,'を実行してもファイルは変更されないため、tar tf /home/archive/log.tarまたはless /home/archive/log.tarを実行している人には引き続きパスが表示されます。

Tarファイルを変更しますか?最初の問題は、tarファイルは変更を目的としていないことです。ファイルを変更すると、基本的にファイルのタールが解除され、必要なものが変更され、タールが変更されます。オリジナルからの再梱包は大丈夫だと思います。

2番目の問題は、タイプミスがある可能性があります。コマンドに書き込むときに/ var/log/alternatives/logを実際にタール化しますか、それとも出力に必要に応じて/var/log/alternatives.logをタールしますか? 2番目を想定します。

もしそうなら、

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に十分なスペースがあることを確認してください(私が行った方法では、さらに2つのファイル用のスペースが必要です)。

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
1
Law29

これは、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 [^/]*$

2つの操作を分離してください。このgrepコマンド:

grep -oP [^/]*$

ファイル名へのパスで行を終了する標準出力またはテキストファイルに適用できます。それだけに制限するのが最善です。 tar -tf archive.tarはファイル名へのパスを出力し、上記のgrepに適した形式です。その出力は次のようになります。

/path/to/folder1/filename1(newline)
/path/to/folder2/filename2(newline)
/path/to/folderN/filenameN(newline)

内訳:[^ /] * $ =行の最後のスラッシュを見つけます。そのポイント以降(スラッシュを除く)から行末まで0文字以上を返します。

1
Kerry Kobashi