我有一台基本上自动化的媒体服务器,目前所有内容都放入一个文件夹中,并按文件扩展名整理到正确的位置。
目前,照片的名称为“folder.jpg”,我需要重命名它们以匹配电影名称。
现在的样子: 之前:
/目录/
- 文件夹.jpg
- 电影.mp4
- 电影.xml
我需要它看起来像什么:之后:
/目录/
- 电影.jpg
- 电影.mp4
- 电影.xml
我将如何将 jpg 与 mp4 匹配。
答案1
尝试:
for movie in ./*/*.mp4; do mv -- "${movie%/*}/folder.jpg" "${movie%.mp4}.jpg"; done
${movie%/*}
并且${movie%.mp4}
都是例子后缀去除。${movie%/*}
返回电影文件所在的目录,并${movie%.mp4}
返回电影文件的名称减去扩展名.mp4
。
例子
考虑三个目录 、dir1
、dir2
和dir3
,其中包含文件:
$ ls -1 */*
dir1/Animal Crackers.mp4
dir1/Animal Crackers.xml
dir1/folder.jpg
dir2/folder.jpg
dir2/Monkey Business.mp4
dir2/Monkey Business.xml
dir3/Duck Soup.mp4
dir3/Duck Soup.xml
dir3/folder.jpg
现在,运行我们的命令:
$ for movie in ./*/*.mp4; do mv -- "${movie%/*}/folder.jpg" "${movie%.mp4}.jpg"; done
运行我们的命令后,文件是:
$ ls -1 */*
dir1/Animal Crackers.jpg
dir1/Animal Crackers.mp4
dir1/Animal Crackers.xml
dir2/Monkey Business.jpg
dir2/Monkey Business.mp4
dir2/Monkey Business.xml
dir3/Duck Soup.jpg
dir3/Duck Soup.mp4
dir3/Duck Soup.xml
多线版本
对于那些喜欢将命令分散在多行中的人:
for movie in ./*/*.mp4
do
mv -- "${movie%/*}/folder.jpg" "${movie%.mp4}.jpg"
done
答案2
find . -type f -name "*.mp4" -execdir bash -c ' [[ -f folder.jpg ]] && mv -v folder.jpg "$(basename {} .mp4).jpg"' \;