user7171044
user7171044

Reputation:

find -exec mv with relative path

I have:

~/par1/
~/par2/*/*

Desired outcome:

~/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

Tried:

cd par2/
find . -name '*.gz' -maxdepth 2 -exec mv {} ../par1/pmc_{} \;

Got:

mv: rename ./par2/par3/file.gz to ../par1/pmc_./par2/par3/file.gz: No such file or directory

Problem:

{} is a filepath, not filename.

Thoughts:

Somehow make my 2nd mv arg use basename?

mv -t looks promising, but I'm on zsh.

Upvotes: 0

Views: 654

Answers (1)

Marlon Richert
Marlon Richert

Reputation: 7020

Since you're on , 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 builtin. It's part of your OS.

Upvotes: 1

Related Questions