【问题标题】:Script for renaming files - removing dash chars from Android resource files重命名文件的脚本 - 从 Android 资源文件中删除短划线字符
【发布时间】:2017-04-09 18:32:48
【问题描述】:

以下脚本(递归)查找当前目录中的所有文件,并将破折号 - 字符替换为文件名中的下划线字符

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 用法以跳过目录路径有什么建议吗?

【问题讨论】:

  • 最好使用小写的变量名来避免与环境变量的潜在冲突...参见unix.stackexchange.com/questions/321697/…
  • 根据您的find 版本和基于perl 的rename 命令的可用性,您可以执行find . -type f -name '*.png' -exec rename -n 's|[^/]+$|$&=~s/-/_/gr|e' {} + 并在您看到该命令按预期工作时删除空运行-n 选项跨度>
  • @Sundeep 在 osx 上运行,它没有 rename,所以我依赖 mv
  • 那么我建议 find . -type f -name '*.png' -exec bash -c 'd=$(dirname "$0"); f=$(basename "$0"); echo mv "$0" "$d/${f//-/_}"' {} \; 而不是使用 find+while
  • @Sundeep 看起来不错 :)

标签: bash


【解决方案1】:

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%/*} 将与/* glob 匹配的右侧最短部分删除,删除斜杠和文件名,给出目录。

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

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多