为什么这个 mv 命令试图写入目录?

为什么这个 mv 命令试图写入目录?

我正在使用这个搜索和替换字符串;

find . -name 'xna*jpg' -exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}' {} \; 

这样它将用 xna.jpg 替换“xna (2018_05_28 14_04_27 UTC).jpg”

然后我可以对整个目录执行此操作。但是,我收到此错误。

mv: ./xna.jpg is not a directory

所以它正在做,但不会写。我不明白为什么它会考虑目录?

答案1

-exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}'

这就是你的问题:你的内容$0被扩展为包含空格的内容,mv因此会看到两个以上的参数。

解决方案:引用东西:

-exec bash -c ' mv "$0" "${0/\ (2018_05_28 14_04_27 UTC)/}"'

find...或者根本不使用:

#!/bin/bash
# looks very similar, with less of the `shopt`ing, in zsh
shopt -s nullglob
shopt -s globstar
shopt -s dotglob
for original in "**/xna (2018_05_28 14_04_27 UTC)*jpg"; do
  newname="${original/\ (2018_05_28 14_04_27 UTC)/}"
  mv "${original}" "${newname}"
done

(如果你愿意的话,你也可以把它放在一行上,但我在这里更看重可读性而不是紧凑性。)

相关内容