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]