On Tue, 8 Feb 2005, James B. Byrne wrote: > I am trying to move a group of sendmail queue files into a special > area and am developing s script to assist. The manual steps are: > > # Identify which messages to move > mailq -qR<domain> > file1 > > # Select only lines with message ID strings > grep '^[[:alpha:]][[:alnum:]]\{13\}' file1 > file2 > > # extract only the messages ID > cut -b -14 file2 > file3 > > # prepend '*' to message IDs > sed "s/^/\*/" file3 > file4 > > All of this works the way that I expect. What I now want to do is > to mv all of the related files listed in file4 in the form > "*messageid" to another directory. Using xargs I expected > (naively) that the following construction would work: > > cat file4 | xargs mv /var/spool/mqueue/'{}' \ > /var/spool/mqueue/offline > > (note that in the original this is all one line.) > > However, when I do this I get the error: > mv: when moving multiple files, last argument must be a directory > Try `mv --help' for more information. > > There is obviously something about xargs that I do not understand. > In my imagination I see this xargs construction expanding to this: > > mv /var/spool/mqueue/*messageid1 /var/spool/mqueue/offline > mv /var/spool/mqueue/*messageid2 /var/spool/mqueue/offline > . > . > . > mv /var/spool/mqueue/*messageidn /var/spool/mqueue/offline > > so that the qf and df files for each message are moved into the > subdirectory offline. But this is obviously incorrect. Can anyone > here point out to me what my misunderstanding is and how to get > this to work? If this is not the forum for this kind of question > then can someone with more experience point me to a mailing list > that would be more suitable? Compare this: echo -e "file1\nfile2\nfile3" | xargs echo '{}' blah with: echo -e "file1\nfile2\nfile3" | xargs -i echo '{}' blah What you require is -i to make '{}' work. xargs by default appends the input as a list of arguments. The manpage says: --replace[=replace-str], -I replace-str, -i[replace-str] Replace occurences of replace-str in the initial arguments with names read from standard input. Also, unquoted blanks do not terminate argu- ments. If replace-str is omitted, it defaults to "{}" (like for 'find -exec'). Implies -x and -L 1. Kind regards, -- dag wieers, dag at wieers.com, http://dag.wieers.com/ -- [all I want is a warm bed and a kind word and unlimited power]