【问题标题】:Bash script for removing spaces from a file name用于从文件名中删除空格的 Bash 脚本
【发布时间】: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 -i juuuust 以防万一。
  • 此问题已在stackoverflow.com/questions/11270453/…@ 中回复
  • 要回答为什么它失败的具体问题(即使已经存在对既定目标的答案),问题是你不排除没有改变的情况到文件名。如果$name$fil 相同(替换后),那么您也可以跳过这种情况(无论是文件还是目录)。但另外,正如@kaylum 所述,您应该检查新名称是否不作为文件或目录存在。
  • @OliverGaida 这是一个 Windows / 批处理文件问题,而不是 Bash。

标签: linux bash ubuntu


【解决方案1】:

只是一个奇怪的解释想法:由于您的错误情况下的name 具有prueba/prueba 的值,但已通过basename 计算,因此它不应包含任何斜杠。难道Downloads/prueba 是符号链接?

【讨论】:

  • 我不擅长符号链接,其实我不明白它们到底是什么,我只知道它们与程序的图标有关。我记得前段时间安装 MATLAB 时,我犯了一个错误,因此,它没有符号链接,每次我想运行它时,我都必须 cd 到它的目录并运行它(我最终修复了它),但这就是我对他们的全部了解
  • 你不需要“擅长”。你只需要检查它是否是一个。您可以将其测试为if [[ -h $name ]]
  • @GustavoLozada : here 是一个简短易读的解释,什么是符号链接。我不确定他们真的是罪魁祸首。我们真的需要你的程序跟踪。
猜你喜欢
  • 2014-10-28
  • 2014-09-26
  • 2015-05-27
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多