shell 如何在macOS终端中批量处理Windows文件?

x6492ojm  于 2023-10-23  发布在  Shell
关注(0)|答案(9)|浏览(150)

我有一个文件夹,里面有一系列文件,名为:

prefix_1234_567.png
prefix_abcd_efg.png

我想 * 批量删除 * 一个下划线和中间的内容,所以输出将是:

prefix_567.png
prefix_efg.png

相关但不完全解释:

cnh2zyt3

cnh2zyt31#

在特定情况下,您可以使用以下bash命令(bash是macOS上的默认shell):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

注意:如果你的文件名有可能以-开头,请将--放在前面[1]:
mv -- "$f" "${f/_*_/_}"

注意:echo被前置到mv,以便执行空运行。删除它以执行实际的重命名。

您可以从命令行运行它或在脚本中使用它。

  • "${f/_*_/_}"bashparameter expansion的一个应用程序:匹配模式_*_的(第一个)子串被替换为文字_,有效地从名称中删除中间标记。
  • 请注意,_*_是一个 pattern(一个正则表达式,也用于globbing),而不是一个 * 正则表达式 *(要了解模式,请运行man bash并搜索Pattern Matching)。

如果你发现自己经常批量重命名文件,考虑安装一个专门的工具,如基于Perl的rename utility。在macOS上,您可以使用流行的包管理器Homebrew安装它,如下所示:

brew install rename

下面是使用rename的顶部命令的等效命令:

rename -n -e 's/_.*_/_/'  *.png

同样,此命令执行一次空运行;删除-n以执行实际的重命名。

  • bash解决方案类似,s/.../.../执行文本替换,但与bash不同的是,使用了true * 正则表达式 *。

[1]特殊参数--的目的是表示后续参数应被视为 * 操作数 *(值),即使它们 * 看起来 * 像 * 选项 *,因为它们以-开始,如Jacob C.所述。

1zmg4dgp

1zmg4dgp2#

要重命名文件,可以使用rename实用程序:
brew install rename
例如,要更改当前目录中所有文件名中的搜索字符串:

rename -nvs searchword replaceword *

删除“n”参数以应用更改。
更多信息:man rename

tag5nh1u

tag5nh1u3#

你可以使用sed:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

结果:

prefix_567.png prefix_efg.png
  • 要先进行空运行,请将末尾的mv替换为echo

说明:

  • e:仅对1个sed命令可选。
  • p:将输入打印到sed,在这种情况下,它将是任何重命名之前的原始文件名
  • @:是/字符的替换,以使sed更具可读性。也就是说,不使用sed s/search/replace/g,而使用s@search@replace@g
  • _.*:下划线是一个转义字符,可以零次或多次引用实际的“.”字符(与正则表达式中的ANY字符相反)
  • -n2:表示有2个输出需要作为参数传递给mv。对于来自 ls 的每个输入,此sed命令将生成2个输出,然后将其提供给mv。
pprl5pva

pprl5pva4#

我有一批文件,看起来像这样:be90-01.png,需要将破折号改为下划线。我用了这个,效果很好:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
2hh7jdfx

2hh7jdfx5#

你可以使用brew安装rename命令。只需要执行brew install rename并使用它。

oyxsuwqo

oyxsuwqo6#

试试这个

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

这里是另一种方法:

for file in Name*.png; do mv "$file" "01_$file"; done
0md85ypi

0md85ypi7#

使用mmv

mmv '*_*_*' '#1_#3' *.png
vql8enpb

vql8enpb8#

由于以编程方式重命名文件是有风险的(如果你错了,可能会有破坏性),我会使用一个专门为批量重命名而构建的具有干运行模式的工具,例如。renamer
此命令将对当前目录中的所有文件进行操作,请使用--dry-run,直到您确信输出看起来正确为止:

$ renamer --find "/(prefix_)(\w+_)(\w+)/" --replace "$1$3" -e name --dry-run *

Dry run

✔︎ prefix_1234_567.png → prefix_567.png
✔︎ prefix_abcd_efg.png → prefix_efg.png

Rename complete: 2 of 2 files renamed.

更多重命名器使用示例here

93ze6v8z

93ze6v8z9#

zsh现在是macOS的默认shell,它有自己的批量重命名功能,zmv有时别名为mmvnoglob zmv -W

相关问题