Hmm, ik zit even met de --keep-newer-files optie te spelen, maar ik begrijp niet helemaal hoe dat nu moet werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| $ tar --version
tar (GNU tar) 1.14
Copyright (C) 2004 Free Software Foundation, Inc.
This program comes with NO WARRANTY, to the extent permitted by law.
You may redistribute it under the terms of the GNU General Public License;
see the file named COPYING for details.
Written by John Gilmore and Jay Fenlason.
$ ls -l
total 12
-rw-r--r-- 1 mh users 0 Aug 12 18:58 a
-rw-r--r-- 1 mh users 0 Aug 12 18:58 b
-rw-r--r-- 1 mh users 0 Aug 12 18:58 c
-rw-r--r-- 1 mh users 0 Aug 12 20:17 d
-rw-r--r-- 1 mh users 10240 Aug 12 20:15 newfiles.tar
$ tar --list --verbose --file newfiles.tar
-rw-r--r-- mh/users 0 2004-08-12 19:05:09 a
-rw-r--r-- mh/users 0 2004-08-12 19:05:09 b
-rw-r--r-- mh/users 0 2004-08-12 18:58:47 c
-rw-r--r-- mh/users 0 2004-08-12 18:58:47 d
$ tar --compare --file newfiles.tar
a: Mod time differs
b: Mod time differs
d: Mod time differs
$ |
Wat je wilt is dat 'a' en 'b' worden uitgepakt, want die zijn nieuwer dan de bestanden 'a' en 'b' op het fs. Voor 'c' hoeft niets te gebeuren. En bestand 'd' is nieuwer op het fs, dus die moet zo blijven. Als ik nu echter uitpak met --keep-newer-files:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| $ tar --extract --keep-newer-files --file newfiles.tar
tar: a: Warning: Cannot stat: No such file or directory
tar: Current `a' is newer
tar: b: Warning: Cannot stat: No such file or directory
tar: Current `b' is newer
tar: Current `c' is newer
tar: Current `d' is newer
$ ls -l
total 12
-rw-r--r-- 1 mh users 0 Aug 12 18:58 c
-rw-r--r-- 1 mh users 0 Aug 12 20:17 d
-rw-r--r-- 1 mh users 10240 Aug 12 20:15 newfiles.tar
$ |
'd' wordt dus netjes bewaard, maar nu ben ik 'a' en 'b' kwijt!
Als je echter zonder --keep-newer-files uitpakt krijg je:
code:
1
2
3
4
5
6
7
8
9
| $ tar --extract --file newfiles.tar
$ ls -l
total 12
-rw-r--r-- 1 mh users 0 Aug 12 19:05 a
-rw-r--r-- 1 mh users 0 Aug 12 19:05 b
-rw-r--r-- 1 mh users 0 Aug 12 18:58 c
-rw-r--r-- 1 mh users 0 Aug 12 18:58 d
-rw-r--r-- 1 mh users 10240 Aug 12 20:15 newfiles.tar
$ |
Nu heb je wel de nieuwe versie van 'a' en 'b', maar ben je de nieuwe 'd' kwijt. Nu is tar ook niet echt bedoeld om directory trees synchroon te houden (rsync is waarschijnlijk een stuk geschikter), maar het lijkt me wel vreemd dat 'a' en 'b' gewist worden.
Om te bereiken wat de TS (volgens mij) wilt kun je het volgende scriptje gebruiken:
Ruby:
1
2
3
4
5
6
7
8
9
10
11
| #!/usr/bin/env ruby
exit 1 if ARGV.size < 1
tarfiles = `tar --list --verbose --utc --file #{ARGV[0]}`.split( /^/).collect { |i|
/(\d\d\d\d)-(\d\d)-(\d\d)\s(\d\d):(\d\d):(\d\d)\s(.*)$/ =~ i
$7 if !test( ?e, $7) || File.stat( $7).mtime < Time.utc( *$~[1..6])
}.compact
system( 'tar', '--extract', '--verbose', '--file', ARGV[0], *tarfiles) if
!tarfiles.empty? |
[
Voor 11% gewijzigd door
_Squatt_ op 13-08-2004 03:52
. Reden: Als ik gedronken heb zie ik mijn grammatica fouten wel :) ]