If you have a group of files whose names end with .new and you want to rename them to end with .old, this won't work:
%mv *.new *.old
Wrong !
because
the shell can't match *.old
(1.18),
and because the mv command just doesn't work that way.
Here's how to do it:
-d \(..\)..\1 |
% |
---|
That outputs a series of mv commands, one per file, and pipes them to a shell. The quotes help make sure that special characters (8.19) aren't touched by the shell - this isn't always needed, but it's a good idea if you aren't sure what files you'll be renaming:
mv 'afile.new' 'afile.old' mv 'bfile.new' 'bfile.old' ...
(To see the commands that will be generated rather than executing
them, leave off the |
sh
or use
sh -v
(8.17).)
To copy, change mv
to cp
.
For safety, use mv -i
or cp -i
if your versions have
the
-i options (21.11).
This method works for any UNIX command that takes a pair of filenames. For instance, to compare a set of files in the current directory with the original files in the /usr/local/src directory, use diff (28.1):
%ls -d *.c *.h | sed 's@.*@diff -c & /usr/local/src/&@' | sh
-