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