Re: xorriso: how to find fixed-string filenames?

"G.raud" <[email protected]>
Newsgroups gmane.comp.audio.cd-record
Message-ID <[email protected]>
> Date: Wed, 16 Apr 2014 10:25:43 +0200
> From: Thomas Schmitt <[email protected]>
> 
> Do i get it right that you want to get a non-zero exit value from
> the program run if none of the files in the list exists in the ISO ?
 
In fact in this case I wanted the simplest beahaviour to abort on any
error: stop if the iso is invalid, stop if any file cannot be found.

> Maybe you would be better off with a simple -ls command while
> wildcard expansion is disabled by -iso_rr_pattern "off":
> 
>   $ xorriso -indev /some/non-ISO \
>             -return_with WARNING 32 -report_about WARNING \
>             -iso_rr_pattern off \
>             -ls "/such*.c" --
>   GNU xorriso 1.3.7 : RockRidge filesystem manipulator, libburnia project.
> 
>   xorriso : WARNING : Not found in ISO image: '/such*.c'
> 
> although a file /such.c does exist in the ISO image. It would be
> listed without warning if -iso_rr_pattern was set to "on" or to "ls".

Thanks for the tip.  The command -lsdl is what I needed; I had
overlooked it and thought that -find was the canonical way to list files
verbosily as it is the only way to list recursively.

> You already get a warning when loading a non-ISO-image.
> 
>   $ xorriso -indev /some/non-ISO \
>             -return_with WARNING 32 -report_about WARNING
>   GNU xorriso 1.3.7 : RockRidge filesystem manipulator, libburnia project.
> 
>   libisoburn: WARNING : No ISO 9660 image at LBA 0. Creating blank image.
>   $ echo $?
>   32
> 
> The commands -report_about and -return_with are already in effect
> when the interpretation of -indev happens. That's because more than
> one such setting might be desired. By this rule they do not have to
> fight for being first command in the list.
> (Normally commands get into effect only after all previous commands
>  in the argument list have been executed.)
> 
> If you really want to tolerate a WARNING with -indev and later take
> WARNING as cause for a non-zero exit value, then you first have to
> set the event thresholds to a higher severity for the duration
> of the -indev command:
> 
>   xorriso -return_with FAILURE 32 -report_about WARNING \
>           -indev /some/non-ISO \
>           -return_with WARNING 32 \
>           -find ...
 
In fact for what I wanted, it seems that the solution is -abort_on:

  $ xorriso -indev img.iso -abort_on WARNING -iso_rr_pattern off \
      -lsdl /file1 /file2
  # to fail earlier:
  $ xorriso -indev img.iso -abort_on WARNING -iso_rr_pattern off \
      -lsdl /file1 -- -lsdl /file2
  # to list all the files:
  $ xorriso -indev img.iso -abort_on WARNING -find / -exec lsdl

There is one small shortcoming though: if the input image is not an iso
but is filled with only nulls (or is empty), then xorriso does not fail:

  $ dd if=/dev/zero of=null.iso count=10; \
    xorriso -indev null.iso -abort_on WARNING -find / -exec lsdl &&
    echo "SUCCESS on null image"
 
> If you just want to know whether a data file is an ISO image
> or not, you could also use the shell command "file"
> 
>   $ file test.iso
>   test.iso: ISO 9660 CD-ROM filesystem data '...Volume.Id...'
> 
>   $ file not_an_iso
>   not_an_iso: ASCII text

I had expected that such a complex piece as xorriso would be able to do
that itself (testing that the input is blank).

  $ xorriso -indev null.iso -abort_on WARNING -find / -exec lsdl &&
    file null.iso | grep -qF null.iso': ISO 9660 '

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

> > The system find has a similar issue, but there is a way to find fixed
> > filenames by using the option -exec
> 
> In xorriso's -find, -exec is not a test and can only appear once.

That is why I suggested a different name of -fexec that would be a test.

> > Would you consider adding a -fexec to your -find to use a system command
> > to test a filename (and maybe more than the filename)?
> 
> That would be applicable to disk files, but not to files in the
> ISO image.
> It would be quite some effort to enable multiple -exec with arbitrary
> xorriso commands and to attribute exit values to those commands.
> This feature of POSIX "find" depends on the concept of a shell resp.
> of POSIX program execution. xorriso would have to mimic this.

What I had in mind is the possibility to make arbitrary tests against
the filename only (that would be passed on the command line of a system
command) and possibly against other attributes like size, mode, time
that would be passed as environement variables ISO_SIZE, ISO_MODE etc.

  $ xorriso -indev img.iso -find \
      -fexec sh -c 'test "$1" = "$2" || test $ISO_MODE = 755' s "$name" '{}' \; \
      -exec lsdl


On Wed, Apr 16, 2014 at 05:00:30PM +0200, Thomas Schmitt wrote:
> Date: Wed, 16 Apr 2014 17:00:30 +0200
> From: Thomas Schmitt <[email protected]>
> 
> i now understand why command -ls is not what you need:
> It warns if any of the given files is missing.
> You want a warning if all given files are missing.

Nope.  This time I wanted a simple behaviour of failing on the first
error (which includes a missing file).

> So i implemented two new -find tests:
> 
>   -use_pattern   "on"|"off"   :  This  pseudo  test  controls  the
>       interpretation of wildcards with tests -name,  -whole_name,  and
>       -disk_name.  Default  is  "on". If interpretation is disabled by
>       "off", then the parameters of -name, -wholename, and  -disk_name
>       have  to  match  literally  rather than as search pattern.  This
>       test itself does always match.
> 
>   -or_use_pattern   "on"|"off"   :    Like    -use_pattern,    but
>       automatically  appending  the  test  by -or rather than by -and.
>       Further the test itself does never match. So a  subsequent  test
>       -or will cause its other operand to be performed.

However this is still useful to list directories recursively and fail if
one is not found.

  $ xorriso -indev img.iso -abort_on WARNING \
      -find -use_pattern off /dir -exec lsdl -- \
      -find -use_pattern off /file -exec lsdl
  # or to list as many files as possible then fail:
  $ xorriso -abort_on WARNING -indev img.iso -abort_on FATAL \
      -find -use_pattern off /dir -exec lsdl -- \
      -find -use_pattern off /file -exec lsdl

I think that it is important to have the possibility to disable patterns
(or regexps), as the alternative is often to have to escape them, which
is not portable I believe, and always painful to write since there is
no standard command to do that for you.  For example I always found it
surprising that there is no standard easy way on UNIX-like systems to
substitute an arbitrary fixed string by another inside a stream, although
it is possible in a filename by using rename(1).

> Your example could look like
> 
>   xorriso -indev image.iso -return_with WARNING 32 -report_about WARNING \
>     -find / -use_pattern off \
>             -wholename "$name1" -or -wholename "$name2" -exec lsdl

This does not even fail when none of the files are found.

> This feature is now in the SVN of libisoburn.

I haven't had a chance to test it yet.

Regards
-- 
G.raud Meyer


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: https://lists.debian.org/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.