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@wieers.com, http://dag.wieers.com/ -- [all I want is a warm bed and a kind word and unlimited power]