【问题标题】:One liner to remove suffix from files in directory从目录中的文件中删除后缀的一个衬垫
【发布时间】:2014-04-05 15:43:22
【问题描述】:

在 OSX 10.8 上,如何通过从名称中删除一定数量的字符来重命名当前目录中的所有文件?示例:

my_img_1@2x.png to become my_img_1.png

所以只会删除@2x 部分。

【问题讨论】:

  • 解释移除部分的规则。

标签: macos bash command-line


【解决方案1】:

执行此操作的确切方法取决于您的文件 - 例如,它们都是 PNG 文件吗?你想从所有这些中删除@2x 吗?这是一个循环,它将从当前目录中的所有文件中删除文件扩展名之前的 3 个字符:

for f in *; do
    echo mv "$f" $(sed -r 's/(.*).{3}\.([^\.]+)/\1.\2/' <<< "$f")
done

如果您的所有文件都命名为[something]@2x.png,并且您希望将它们重命名为[something].png,这将起作用:

for f in *; do
    echo mv "$f" "${f%@*}.png"
done

这可以使用parameter expansion - 实际上构造${var%pattern} 意味着“采用$var 并从其末尾删除匹配[pattern] 的最短字符串”。所以在这种情况下,${f%@*} 的意思是“从$f 中删除最后一个@ 以及它之后的任何内容”。然后我们附加.png 来替换作为该操作的一部分被删除的文件扩展名。

$f = filename@2x.png
${f%@*} = filename
${f%@*}.png = filename.png

【讨论】:

  • 是的,它们都是 PNG。我想从指定文件夹中的文件中删除所有@2x。所以最好不要指定每个文件。
  • 这只是一个例子,for f in * 命令将对当前目录中的所有文件运行。我将添加一个您可以使用的附加命令。
  • 已编辑答案,希望对您有所帮助。谷歌搜索“bash 参数扩展”可能更有启发性。
  • 啊,好吧,所以@* 只是通配符。我认为这是某种正则表达式。很好的答案,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2010-09-08
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2013-05-30
相关资源
最近更新 更多