Reputation:
~/par1/
~/par2/*/*
~/par2/*/*.gz
-> ~/par1/pmc_{}.gz
e.g. ~/par2/par3/name.gz
-> ~/par1/pmc_name.gz
e.g. flatten the files in ~/par2/
to ~/par1/
w/ some preprending to the filename
NOTE: this is for millions of files so it has to be find
cd par2/
find . -name '*.gz' -maxdepth 2 -exec mv {} ../par1/pmc_{} \;
mv: rename ./par2/par3/file.gz to ../par1/pmc_./par2/par3/file.gz: No such file or directory
{}
is a filepath, not filename.
Somehow make my 2nd mv
arg use basename
?
mv -t
looks promising, but I'm on zsh.
Upvotes: 0
Views: 654
Reputation: 7020
Since you're on zsh, just use zmv
:
% autoload -Uz zmv # Add this to your .zshrc file, to not have to type it again.
% mkdir -p par1 par2/par3
% touch par2/par3/{0..9}.gz
% zmv -v 'par2/(*)/(*).gz' 'par1/pmc_$2.gz' # -v for verbose
mv -- par2/par3/0.gz par1/pmc_0.gz
mv -- par2/par3/1.gz par1/pmc_1.gz
mv -- par2/par3/2.gz par1/pmc_2.gz
mv -- par2/par3/3.gz par1/pmc_3.gz
mv -- par2/par3/4.gz par1/pmc_4.gz
mv -- par2/par3/5.gz par1/pmc_5.gz
mv -- par2/par3/6.gz par1/pmc_6.gz
mv -- par2/par3/7.gz par1/pmc_7.gz
mv -- par2/par3/8.gz par1/pmc_8.gz
mv -- par2/par3/9.gz par1/pmc_9.gz
%
PS:
mv -t
looks promising, but I'm on zsh.
mv
is not a zsh builtin. It's part of your OS.
Upvotes: 1