Sorry for the toppost but i don't know where this should go.

My understanding is that you should be putting the S flag at the START of the transform= line, not the end as it's actioned in order from the = and s is also a transform flag so is actioned first and would overwrite the S flag, ie the S would be ignored.


https://www.gnu.org/software/tar/manual/html_section/transform.html#transform is the refreance page for this. Look about halfway down for 's' and 'S'.

regards

scsijon

On 20/5/22 06:08, [email protected] wrote:
    1. Tar --transform is weird. (Rob Landley)


----------------------------------------------------------------------

Message: 1
Date: Thu, 19 May 2022 08:58:49 -0500
From: Rob Landley <[email protected]>
To: toybox <[email protected]>
Subject: [Toybox] Tar --transform is weird.
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8

The "only apply transforms to certain file types" selection is CONCEPTUALLY
broken because the directories leading to those entries participate in the
transform, and the directories have their own type (which is not listed), and
each directory is stored in its own entry because tar x doesn't mkdir -p. So if
you make a symlink and a file in a deepish hirerarchy but only adjust the
directory names of SOME entries, it's not gonna extract right? Let's try:

$ ln -s seven one/two/three/four/five/six
$ touch one/two/three/four/five/eight

And then tell debian's tar to modify the path of non-symlinks:

$ tar cv one --xform=s/three/zero/S | tar t
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/zero/
one/two/zero/four/
one/two/zero/four/five/
one/two/zero/four/five/eight
one/two/zero/four/five/six

The symlink's path is modified despite the S exclusion. What happens if I tell
it to apply a different change that includes the filename:

$ tar cv one --xform=s@five/six@seven@S | tar t
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/seven

The "do not apply to symlink" got ignored? How about JUST the filename?

8$ tar cv one --xform=s@six@seven@S | tar tone/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/seven

What does the S exclusion MEAN here?

landley@driftwood:~/toybox/toybox/sub8$ ls -ls one/two/three/four/five
total 0
0 -rw-r--r-- 1 landley landley 0 May 19 08:29 eight
0 lrwxrwxrwx 1 landley landley 5 May 19 08:29 six -> seven

$ tar cv one --xform=s@eight@nine@R | tar t
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six

The "do not apply to regular files" exclusion is working...

$ tar cv one --xform=s@three@zero@R | tar t
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six

Including for directory entries?

$ tar cv one --xform=s@three@zero@r | tar t
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/zero/
one/two/zero/four/
one/two/zero/four/five/
one/two/zero/four/five/eight
one/two/zero/four/five/six

$ tar cv one --xform=s@six@seven@r | tar tone/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/six
one/
one/two/
one/two/three/
one/two/three/four/
one/two/three/four/five/
one/two/three/four/five/eight
one/two/three/four/five/seven

So it thinks directories are regular files. It also thinks (dangling) SYMLINKS
are regular files...

$ tar c ccc --xform s/ccc/abd/S | tar t
abd
$ tar c ccc --xform s/ccc/abd/R | tar t
ccc

Ok, non-dangling symlinks with no directory component are ALSO regular files. It
seems to think EVERYTHING is a regular file. Great. (I have not poked much at
hardlinks yet because it seems a bit obscure?)

Sigh. I am trying to work out what to implement here, and it's... not well
specified. (Can I just NOT implement the /RHS part yet and call it good? So far
it looks like specifying "R" means "ignore this --xform" and everything else is
a NOP? Modulo the H exclusion I haven't tested yet because hardlinks don't come
up much...)

Rob


------------------------------

Subject: Digest Footer

_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net


------------------------------

End of Toybox Digest, Vol 127, Issue 16
***************************************
_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to