【问题标题】:How to remove all parts of a filename after the first dot on mac如何在mac上的第一个点之后删除文件名的所有部分
【发布时间】:2020-05-03 12:47:44
【问题描述】:

我正在尝试在 mac 终端上执行此操作

我想去掉文件名第一个点之后的所有字段,但保留最后的扩展名,并且可以有任意长度的点。

输入:

file1.some.stuff.mp3 file2.other.stuff.stuff.mp3 file3.some.thing.mp3 file4.one.two.three.four.mp3

预期输出:

file1.mp3 file2.mp3 file3.mp3 file4.mp3

我将所有文件都放在同一个文件夹中。

【问题讨论】:

标签: bash macos terminal rename filenames


【解决方案1】:

只要保证文件名至少有一个 . 并且在 . 之前和之后都有非空字符串,这就是简单的参数扩展问题。

for f in file1.some.stuff.mp3 file2.other.stuff.stuff.mp3 file3.some.thing.mp3 file4.one.two.three.four.mp3; do
    echo "${f%%.*}.${f##*.}"
done

生产

file1.mp3
file2.mp3
file3.mp3
file4.mp3

在文件退出的目录中,使用类似

for f in *.mp3; do

遍历所有 MP3 文件。

【讨论】:

  • 是的!这会在控制台中打印我需要的内容,但使用 echo 它只在控制台中打印它不会更改实际的文件名,我可以使用哪个命令来执行该操作?
  • mv -- "$f" "${f%%.*}.${f##*.}",但我建议确保在实际执行 mv 命令之前,这不会导致两个或多个原始文件被重命名为相同。
  • 是的,谢谢,实际上我差点把那里的很多文件都杀掉了!
【解决方案2】:

使用 bash 变量替换,您可以实现以下目标:

for i in file1.some.stuff.mp3 file2.other.stuff.stuff.mp3 file3.some.thing.mp3
do
  echo "${i/.*./.}"
done

${i/.*./.} 表示将.*. 替换为.。也就是说,它将匹配file1.some.stuff.mp3 中的.some.stuff.a.b.c.d.e 中的.b.c.d.

man bash参数扩展部分:

${参数/模式/字符串} 模式替换。该模式被扩展以产生一个模式,就像在路径名扩展中一样。参数是 展开并且模式与其值的最长匹配被替换为字符串。

【讨论】:

    【解决方案3】:
    for i in `ls *.mp3`; do NAMES=`echo $i|cut -d. -f1`; mv "$i" "$NAMES.mp3"; done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2023-02-06
      • 2012-08-23
      相关资源
      最近更新 更多