Bash脚本将文件名中的所有连字符替换为点

Bash脚本将文件名中的所有连字符替换为点,bash,Bash,我想要一个脚本,用XXXX-XX-XX文件名中表示的日期中的点替换连字符。因此,所谓的2019-09-05移动到2019.09.05。我研究了类似问题的其他解决方案,并得出以下结论: for file in *-*-*; do mv "$file" "$(echo "$file" | sed s/*-*-*/*.*.*/)" done 但所有这些操作都是将所有由连字符分隔的文件替换为一个名为..*的文件。我不完全确定bash正则表达式是如何工作的,或者我需要如何格式化它的输出端以使其工

我想要一个脚本,用XXXX-XX-XX文件名中表示的日期中的点替换连字符。因此,所谓的2019-09-05移动到2019.09.05。我研究了类似问题的其他解决方案,并得出以下结论:

for file in *-*-*; do
    mv "$file" "$(echo "$file" | sed s/*-*-*/*.*.*/)"
done

但所有这些操作都是将所有由连字符分隔的文件替换为一个名为..*的文件。我不完全确定bash正则表达式是如何工作的,或者我需要如何格式化它的输出端以使其工作。有什么想法吗?

要保留这三个片段,需要用括号捕捉它们,然后在替换字符串中使用反引用\1、\2、\3。sed还需要一个正则表达式,因此*变为。*

或者,你可以用点代替破折号,忽略中间的东西

for file in *-*-*; do
    mv "$file" "$(echo "$file" | sed 's/-/./g')"
done
更简单的方法是使用bash语法而不是sed进行替换

for file in *-*-*; do
    mv "$file" "${file//-/.}"
done

要保留这三个片段,您需要用括号捕获它们,然后在替换字符串中使用反向引用\1、\2、\3。sed还需要一个正则表达式,因此*变为。*

或者,你可以用点代替破折号,忽略中间的东西

for file in *-*-*; do
    mv "$file" "$(echo "$file" | sed 's/-/./g')"
done
更简单的方法是使用bash语法而不是sed进行替换

for file in *-*-*; do
    mv "$file" "${file//-/.}"
done

如果您使用的是纯bash环境,并且不介意可移植性,那么可以使用:

如果您仍然想使用sed,只需用sed-es/-/./g替换您所做的

编辑: 正如@pjh所说,for语句中使用的*-*-*也将检查以连字符开头的文件


因此,最好使用mv-${file}${file/-/-/.}而不是简单的mv${file}${file/-/.}来避免混淆,从而使脚本更加健壮。

如果您使用的是纯bash环境,并且不介意可移植性,那么您可以使用:

如果您仍然想使用sed,只需用sed-es/-/./g替换您所做的

编辑: 正如@pjh所说,for语句中使用的*-*-*也将检查以连字符开头的文件


因此,最好使用mv-${file}${file/-/-/.}而不是简单的mv${file}${file/-/.}来避免混淆,使脚本更加健壮。

@pjh这里给出的每个答案都是如此,但OP提出了一个总是以数字开头的文件的解决方案……最好编写代码,尽可能少地假设文件名中可能出现的字符。需求发生变化,代码尤其是从StackOverflow!复制!。解决方案代码部分遵循了这一原则,因为如果文件名的格式为YYYY-MM-DD,它使用的引号是不必要的。我发现最好完全遵循这一原则。你是绝对正确的,我喜欢这种想法,但我们在这里只是针对问题的一部分,而不是整个问题提出切实可行的解决方案,否则,我们应该检查其他东西,比如空闲内存,或者使用regex检查文件名本身。。。例如,qwe asd zxc也将匹配,这不是OP要求的。。。这里有太多的事情需要考虑,你不可能在这里的每一个回复中都完全遵循它们SO@pjh这里给出的每一个答案都是如此,但OP提出了一个解决方案,用于总是以数字开头的文件……最好编写代码,尽可能少地假设文件名中可能出现的字符。需求发生变化,代码尤其是从StackOverflow!复制!。解决方案代码部分遵循了这一原则,因为如果文件名的格式为YYYY-MM-DD,它使用的引号是不必要的。我发现最好完全遵循这一原则。你是绝对正确的,我喜欢这种想法,但我们在这里只是针对问题的一部分,而不是整个问题提出切实可行的解决方案,否则,我们应该检查其他东西,比如空闲内存,或者使用regex检查文件名本身。。。例如,qwe asd zxc也将匹配,这不是OP要求的。。。这里有太多的事情需要考虑,你不可能在这么短的时间内每次回复都能完全理解