【发布时间】:2021-01-26 08:47:24
【问题描述】:
我正在编写一个 bash 脚本,它将当前目录中文件名中的空格更改为下划线。这是脚本:
#!/bin/bash
for fil in "$(pwd)"/*; do
basefil=$(basename "$fil") #get name of file
name=${basefil// /_}
if [[ ! -f "$name" ]]; then
echo "$fil" "$name"
mv "$fil" "$name"
fi
done
问题是我得到了这样的东西:
mv: cannot move '/home/gustavolozada/Downloads/prueba' to a subdirectory of itself, 'prueba/prueba'
我只在目录中得到这个。我添加了echo "$fil" "$name" 以获得更多信息,这就是它所显示的:
/home/gustavolozada/Downloads/prueba prueba
我不明白是什么问题,因为命令基本上是:
mv /home/gustavolozada/Downloads/prueba prueba
这对我来说没有任何问题(除了它们是同一个文件之外,但我已经检查了目录中是否存在具有该名称的文件 if [[ ! -f "$name" ]]; then
【问题讨论】:
-
-f只检查文件而不是目录。使用-d作为目录。 -
实际上,在尝试重命名之前,使用
-e检查是否有新名称下的anything(目录、文件等)存在。您也可以使用for fil in "$(pwd)"/*" "*; do,因此它只会尝试重命名名称中实际包含空格的内容。我还推荐mv -ijuuuust 以防万一。 -
此问题已在stackoverflow.com/questions/11270453/…@ 中回复
-
要回答为什么它失败的具体问题(即使已经存在对既定目标的答案),问题是你不排除没有改变的情况到文件名。如果
$name和$fil相同(替换后),那么您也可以跳过这种情况(无论是文件还是目录)。但另外,正如@kaylum 所述,您应该检查新名称是否不作为文件或目录存在。 -
@OliverGaida 这是一个 Windows / 批处理文件问题,而不是 Bash。