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