Answers:
这个问题本身也不是很精确,因为OP谈论的是:
ABC 123456(不带扩展名),但在示例代码中使用*.txt扩展名ABC - 123456,但是在接下来的时间里加上counting to 4和count 3,例如,不能完全清除脚本应该执行的操作,例如,如果find ABCD 12或AB 345该问题可分为3个单独的部分:
广告“选择正确的文件”。选择文件可以通过某些外部实用程序来完成,例如通过find命令。的主要好处find是:
man find。)广告“准备新名称”。这可以通过外部程序来完成,比如sed或awk或什么可以在shell脚本处理文本,任何程序或者是可以做到(在一些简单的情况下,这些本)withing的bash本身-并且可能节省昂贵的一个命令执行。(对于成千上万的文件而言,这有所作为)。
下列:
${file/ /-}
用破折号()替换(替换)一个空格(/ /部分)。所以有可能写/-
mv "$file" "${file/ /-}"
并保存sed执行。
因此,替代解决方案之一可能是,例如:
#!/bin/bash
while IFS= read -r -d $'\0' filename
do
newfilename="${filename/ /-}"
[[ "$filename" != "$newfilename" ]] && echo mv -i "$filename" "$newfilename"
done < <(find . -maxdepth 1 -type f -iname "* *.jpg" -print0)
abobe适用于DRY RUN-它只会显示,将要执行的操作,对于真正的执行,请删除echo。
分解:
选择正确的文件进行重命名:find . -maxdepth 1 -type f -iname "* *.jpg" -print0将找到所有
-maxdepth 1)-type f)-print0)周期 while IFS= read -r -d $'\0' filename; do ... done < <( )
find命令的输出-d $'\0')-r)/高级主题-此处无需解释/IFS= 防止修剪文件名中的前导和尾随空格(也是高级主题)准备新的文件名 newfilename="${filename/ /-}"
bash内部完成(不执行外部命令)。${filename/ /- }实际的重命名是通过mv命令(man mv从终端查看)完成的,其中
-i什么会询问用户是否在这里已经是与新的文件名(不重写)并且mv仅当newfilename不同于时才执行。filename [[ "$filename" != "$newfilename" ]]
上面的解决方案通常很容易出错,但是仍然不是很有效,因为数十万个文件将执行数十万次mv命令。解决方案可以是:使用某些实用程序,无需执行mvN次命令即可读取文件名并进行重命名。例如,系统的“大手枪”将“ perl”管理为:
find . -maxdepth 1 -type f -iname "*.jpg" -print0 |\
perl -0nle '$n=$_; $n=~s/ /-/; rename $_,$n unless($_ eq $n || -e $n)'
将重命名所有文件的文件将find在一次执行中输出-例如,快于数千次mv执行。
Tor测试(DRY RUN)使用以下方法:
find . -maxdepth 1 -type f -iname "*.jpg" -print0 |\
perl -0nle '$n=$_; $n=~s/ /-/; print qq{old:$_ new:$n\n} unless($_ eq $n || -e $n)' #print instead of the rename
附言:perl功能强大,足以处理一切本身,例如。也可以使用find命令,但这是更高级的主题...
Ps2:我的英语水平比我的差很多bash,所以有人可以编辑此帖子以添加/更正内容。.;;)
如果您的文件名是“ ABC 123456”,并且前3个字符与后面的字符之间有单个空格,则您尝试用字符(或破折号或其他字符)替换该空格,使其看起来像ABC-123456。
我发现这篇文章解释了如何做到这一点。
例:
请注意,以下命令仅将连字符替换为空格。如果您需要其他替换,则必须相应地修改命令
for i in *.JPG; do mv "$i" "`echo $i | sed -e 's, ,-,g'`"; done
其他:
如果您要使用下划线或其他字符代替连字符,只需s, ,-,g将上述命令的一部分切换为即可s, ,_,g。
对于如何看这篇文章。
这是我的MBA 10.9.5 测试(我使用了ABC 123456.png文件)并将其放置在新文件夹中。比我在终端中的目录中执行cd并运行
for i in *.png; do mv "$i" "`echo $i | sed -e 's, ,-,g'`"; done
结果是,它很好用(它重命名了文件)
它是如何工作的:它将替换该文件夹中所有* .png文件的文件名中的空格,因此请确保先将其放在正确的文件夹中。
