我正在尝试使用我在 GitHub 上找到的缩略图生成器 python 脚本,效果非常好。
它会在名为 的文件夹中生成缩略图eaDir_temp
,然后需要在 NAS 上将其重命名为@eaDir
来自终端。作者为此提供了一个命令:
find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;
不幸的是,对于每个包含照片的子文件夹,它返回:
mv: cannot move ‘./subfolder/eaDir_tmp’ to ‘@eaDir/eaDir_tmp’: Directory not empty
我该怎么办?
答案1
对于好奇的人来说,可能会发生什么:命令
find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;
将它找到的每个./whatever/eaDir_tmp
目录(即组件eaDir_tmp
)移动到当前工作目录:./whatever/eaDir_tmp
→ ./@eaDir
。 (因为@eaDir
被视为mv
相对于当前工作目录的路径组件)。
第一次,./@eaDir
如果尚不存在,则会创建 。
第二个./whatever/eaDir_tmp
找到的已移动进入 ./@eaDir
,因为此时给定mv
( )的目标目录已存在: → 。@eaDir
./whatever/eaDir_tmp
./@eaDir/eaDir_tmp
进一步找到也./subfolder/eaDir_tmp
移入,这一步失败,因为已经存在且不为空。./@eaDir
./@eaDir/eaDir_tmp
您可以做什么:如果您的find
实施支持该-execdir
操作:
find . -depth -type d -name 'eaDir_tmp' -execdir mv '{}' @eaDir \;
-depth
实际上仅在嵌套目录的情况下才需要eaDir_tmp
(例如./whatever/eaDir_tmp/whatever/eaDir_tmp
)。
与 相反-exec
,-execdir
从包含匹配文件的目录(而不是从 的find
当前工作目录)运行指定的命令。
如果您find
不支持非标准-execdir
:
find . -depth -type d -name 'eaDir_tmp' \
-exec sh -c 'mv "$1" "${1%/*}/@eaDir"' mysh {} \;
或者,避免为每个找到的目录启动 shell:
find . -depth -type d -name 'eaDir_tmp' -exec sh -c '
for dir
do
mv "$dir" "${dir%/*}/@eaDir"
done' mysh {} +