如何将文件夹中的单个文件重命名为准确的文件夹名称,同时保留文件扩展名?

如何将文件夹中的单个文件重命名为准确的文件夹名称,同时保留文件扩展名?

我有数百个文件夹,每个文件夹都有一个视频文件。我需要将视频文件名更改为与文件夹名称完全匹配,并保留扩展名。例如:

/home/username/Videos/My Video File 1/some.video.file.name.mp4

将更改为

/home/username/Videos/My Video File 1/My Video File 1.mp4

理想情况下,该过程将在“视频”文件夹中运行,以处理所有“我的视频文件 1,2,3,...等”文件夹和包含的文件。

我已经安装了“重命名”,并使用了几个示例,例如:

rename -v 's/(.*)\//$1\/$1/' */*

这会正确地添加文件夹名称,但会保留我想要替换的附加文件名。我只是不知道如何修改它来做到这一点。


更新:为了进行受控测试,我在“视频”文件夹中设置了两个文件夹,每个文件夹包含一个视频文件。文件夹和文件名显示了视频文件名称的格式,其中包含各种空格、点、破折号、下划线和括号。文件夹名称很简洁,除了许多带有空格和括号且其中包含视频日期的文件夹。

当我运行上面答案中提供的脚本时,我得到了以下结果:

~/Videos$ for ext in mp4 avi mkv; do for     file in $(find /home/username/Videos -name "*.$ext"); do dir=$(dirname $file); fn=$(basename $dir); mv $file $dir/$fn. $ext; done; done

我得到这个结果:

mv: target 'mp4' is not a directory
mv: target 'mp4' is not a directory
mv: target 'mp4' is not a directory
mv: target 'mp4' is not a directory
mv: target 'mkv' is not a directory
mv: target 'mkv' is not a directory
mv: target 'mkv' is not a directory

使用“tree”命令,以下是两个视频文件夹的内容:

Videos
├── Disneyland
│   └── Disneyland 720P H265-One.mkv
└── The Family Video (2020)
    └── The.Family.Video.(2020).720P.H265-One.mp4

该脚本在视频文件夹中运行时应产生以下结果:

Videos
├── Disneyland
│   └── Disneyland.mkv
└── The Family Video (2020)
    └── The Family Video (2020).mp4

我怀疑文件夹名称中的空格是问题所在,但从“mv:”错误消息来看,似乎还有更多问题。

答案1

假设您知道可能的扩展,一个简单的 bash 命令行就可以执行以下操作:

for ext in mp4 mpg avi mkv; do for file in $(find /home/username/Videos -name "*.$ext"); do dir=$(dirname $file); fn=$(basename $dir); mv $file $dir/$fn.$ext; done; done

相关内容