【问题标题】:find -exec mv with relative path使用相对路径查找 -exec mv
【发布时间】: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 -imv -n 以避免在出现命名冲突时覆盖文件。
  • 在这种情况下我看不到execdir 的实用性。从它的人:“像-exec,但指定的命令是从包含匹配文件的子目录运行的,通常不是你启动find的目录。”
  • 由于-execdir 在子目录中运行该命令,它会将{} 替换为文件名而不是文件路径。试试-execdir echo {} \; 看看我的意思。

标签: bash zsh


【解决方案1】:

由于您使用的是,请使用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 看起来很有希望,但我在 zsh 上。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多