2017-04-09 185 views
2

以下脚本删除破折号字符发现在当前目录(递归)中的所有文件,并替换破折号 - 字符转换为下划线字符文件名脚本重命名文件 - 从Android的资源文件

find . -type f -name '*.png' | while read FILE ; do 
    newfile="$(echo ${FILE} |sed -e 's/-/_/g')"; 
    mv "${FILE}" "${newfile}" ; 
done 

给出一个文件包含破折号的路径(例如,drawable-hdpi/file-name.png),脚本会尝试将其重命名为drawable_hdpi/file_name.png - 替换目录名称中的破折号以及文件名中的破折号。

我想避免修改目录路径,只重写文件名。

有关如何修改sed用法以跳过目录路径的任何建议?

+0

使用小写变量名称以避免与环境变量的潜在冲突是一个很好的做法......请参阅https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-输出不良练习 – Sundeep

+0

取决于你的'find'版本和基于'rename'命令的可用性,你可以'find。 -type'fname'* .png'-exec rename -n's | [^ /] + $ | $&=〜s/-/_/gr | e'{} +'并且移除干运行' - n'选项,一旦你看到该命令按预期工作 – Sundeep

+0

@Sundeep在osx上运行,它没有重命名,所以我依赖于mv – aviran

回答

2

shell有一些漂亮的字符串操作符来切掉部分变量。你的shell手册页有所有的细节。下面是我会怎么使用它们:

find . -type f -name '*.png' | 
while read FILE; do 
    dir=${FILE%/*} 
    newfile=$(echo "${FILE##*/}" |sed -e 's/-/_/g') 
    mv "${FILE}" "${dir}/${newfile}" 
done 

说明:

dir=${FILE%/*}砍下最短的部分从匹配/*水珠,消除斜线和文件名,并赋予该目录的权利。

${FILE##*/}删除左边匹配的最长部分*/,即只留下文件名。

+0

很好用,谢谢! – aviran