如何在终端中重命名文件而忽略文件扩展名?

如何在终端中重命名文件而忽略文件扩展名?

我有几个视频文件夹需要重命名为统一的名称,例如:foldername.videotypexvideonumber.avi。我考虑创建一个 shell 脚本来简化这一过程。mv命令似乎是执行此操作的最佳方法。

但是,我见过的所有指南/教程/手册页都说,重命名文件时还必须包含文件扩展名。这通常没问题,但有些文件夹包含多种文件类型的视频,例如 .mkv 和 .avi,甚至一些 .rmvb 文件。

所以,我需要知道是否有办法通过终端重命名文件没有执行此操作时必须指定文件类型 - 基本上这样扩展名保持不变,无论重命名之前是什么。

答案1

了解以下内容会有所帮助确切地你想做什么,但你肯定能做到这一点。学习BASH 参数扩展可能是非常必要的。

根据您要执行的操作,您可能需要分离扩展名和文件名,或者可能不需要。

我假设您已经cd进入了包含相关文件的文件夹。

情况1:假设您想将每个文件名中的字符串“bad”更改为“good”;那么您可以使用简单的替换,即,您可以执行以下操作:

for file in * ; do mv "$file" "${file//bad/good}" ; done

(请确保不会发生任何变化,因为将坏的改为好的会覆盖已经存在的某些内容。)无论扩展如何,这都可以起作用。

情况 2:假设您需要在扩展名前添加“new”,无论它是什么,然后您可以执行以下操作:

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

无论扩展名是什么,它都将保持不变。

我会提供更多建议,但我真的不知道你到底想做什么。

答案2

快速回答:

您不能这样做,因为扩展名是文件名的一部分。

长答案:

您可以使用图形界面执行高级重命名,purrr或者gprename

但!

在批量重命名脚本中,您可以使用以下文件名拆分技术:

FULLFILENAME="/home/user/video/myvideo-release.xvid.128kbps.avi"
DIRNAME=$(dirname ${FULLFILENAME})   #-- /home/user/video
BASENAME=$(basename ${FULLFILENAME}) #-- myvideo-release.xvid.128kbps.avi
FILENAME=${BASENAME%.*}              #-- myvideo-release.xvid.128kbps
EXTENSION=${BASENAME##*.}            #-- avi

答案3

[temp] λ = ls
test.doc  test.rtf  test.txt
[temp] λ = for f in *; do mv "$f" test2`echo "$f" | sed 's/[^.]*//'`; done
[temp] λ = ls
test2.doc  test2.rtf  test2.txt

可能有更优雅的方法来实现它,但它确实有效

代替测试2任何你想要的计数器或东西。

相关内容