【发布时间】:2021-04-09 04:44:28
【问题描述】:
我有:
~/par1/
~/par2/*/*
期望的结果:
~/par2/*/*.gz -> ~/par1/pmc_{}.gz
例如~/par2/par3/name.gz -> ~/par1/pmc_name.gz
例如将~/par2/ 中的文件展平为~/par1/,并在文件名前添加一些前缀
注意:这是针对数百万个文件的,所以它必须是 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
问题:
{} 是文件路径,而不是文件名。
想法:
不知何故让我的第二个mv arg 使用basename?
mv -t 看起来很有希望,但我在 zsh 上。
【问题讨论】:
-
会用
-execdir代替-exec解决吗?顺便说一句,我强烈建议您首先确保您有一个良好的备份,以防出现严重错误,并使用mv -i或mv -n以避免在出现命名冲突时覆盖文件。 -
在这种情况下我看不到
execdir的实用性。从它的人:“像-exec,但指定的命令是从包含匹配文件的子目录运行的,通常不是你启动find的目录。” -
由于
-execdir在子目录中运行该命令,它会将{}替换为文件名而不是文件路径。试试-execdir echo {} \;看看我的意思。