【问题标题】:How to rename without remove the extionsion dot of a file name如何重命名而不删除文件名的扩展点
【发布时间】:2019-01-06 13:38:35
【问题描述】:

为了重命名带有 .wav 和 .flac 扩展名的音乐样本,我使用了这一行:

for f in * ; do rename 's/[^a-zA-Z0-9:0:4]//g' "$f" ;done

但是会发生什么,当文件名是这样的时候:

name * of ( the f?ile.wav 

变成:

nameofthefilewav

应该是:

nameofthefile.wav

我需要什么才能将扩展点放在他的位置上?

【问题讨论】:

  • 只是替换扩展名?也许rename 's/.wav$/.flac/' *.wav
  • 您正在尝试通过执行[^a-zA-Z0-9:0:4] 替换不在[..] 中的任何内容,但您错过了.
  • 为什么文件名中有[] 部分?是否建议了一个例子?如果不删除它
  • @ReutSharabani for f in * ;重命名 's/.wav$/.flac/' *.wav "$f" ;这样做我必须注意扩展名是什么 - cq 否则它会将所有 wav 更改为 flac - 它可以工作但是这不是我想要的。

标签: bash rename


【解决方案1】:

您可以使用basename 和参数扩展来获取文件名及其扩展名。

filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"

答案来自here

编辑:

bash-4.1$ ls
1.mp3  2.mp3  3.mp3
bash-4.1$ for f in `ls`; do
filename=$(basename -- "$f")
extension="${filename##*.}"
filename="${filename%.*}"
echo "FROM: $filename.$extension TO: $filename.wav"
done
FROM: 1.mp3 TO: 1.wav
FROM: 2.mp3 TO: 2.wav
FROM: 3.mp3 TO: 3.wav

【讨论】:

  • 我不明白这个怎么用?我在 $filename 上使用 echo 尝试了此操作,但它不打印任何内容
  • - for f in * ; do rename 's/ //' *.wav "$f" ;done - 这和你所拥有的一样。它只删除空格。我还想删除不需要的字符,例如 * ; ( & ) e.t.c - 我不会更改扩展名。
  • 这会更改扩展名,但在我的情况下,删除扩展名之前的点没有留下任何扩展名。
  • 仅对 $filename 进行重命名,然后将其与 "\.$extension" 连接起来
  • 是的,我认为这也是可能的解决方案,感谢您与我一起思考 - 我认为为扩展替换点一定很容易 - 我在 Python 中知道。我会投票给你的答案,而不是我不会的,但到目前为止没有别的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多