Bash 使用相对路径查找-exec mv 我有: 预期结果:

Bash 使用相对路径查找-exec mv 我有: 预期结果:,bash,zsh,Bash,Zsh,~/par2/*/*.gz->~/par1/pmc{}.gz e、 g.~/par2/par3/name.gz->~/par1/pmc\u name.gz e、 g.将~/par2/中的文件展平到~/par1/中,并对文件名进行一些预处理 注意:这适用于数百万个文件,因此必须是find 尝试: 得到了: 问题: {}是文件路径,而不是文件名 思想: 以某种方式使我的第二个mvarg使用basename mv-t看起来很有希望,但我在zsh上。既然你在,就用: %autoload-Uz zmv#将

~/par2/*/*.gz
->
~/par1/pmc{}.gz

e、 g.
~/par2/par3/name.gz
->
~/par1/pmc\u name.gz

e、 g.将
~/par2/
中的文件展平到
~/par1/
中,并对文件名进行一些预处理

注意:这适用于数百万个文件,因此必须是
find

尝试: 得到了: 问题:
{}
是文件路径,而不是文件名

思想: 以某种方式使我的第二个
mv
arg使用
basename

mv-t
看起来很有希望,但我在zsh上。

既然你在,就用:

%autoload-Uz zmv#将其添加到.zshrc文件中,以避免再次键入。
%mkdir-p par1 par2/par3
%触摸par2/par3/{0..9}.gz
%zmv-v'par2/(*)/(*).gz''par1/pmc_u$2.gz'#-v表示详细
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
%
附言:

mv-t
看起来很有希望,但我在zsh上


mv
不是内置的。它是您操作系统的一部分。

使用
-execdir
而不是
-exec
可以解决这个问题吗?顺便说一句,我强烈建议您首先确保有一个良好的备份,以防出现严重错误,并使用
mv-I
mv-n
避免在出现命名冲突时覆盖文件。在这种情况下,我看不到
execdir
的实用程序。它的man:“像
-exec
,但是指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是启动
find
”的目录。因为
-execdir
在子目录中运行命令,所以它用文件名而不是文件路径替换
{}
。尝试使用
-execdir echo{}以了解我的意思。
~/par1/
~/par2/*/*
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