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
命令。解决方案可以是:使用某些实用程序,无需执行mv
N次命令即可读取文件名并进行重命名。例如,系统的“大手枪”将“ 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文件的文件名中的空格,因此请确保先将其放在正确的文件夹中。