查找并重命名文件,添加部分路径到文件名

查找并重命名文件,添加部分路径到文件名

我有一个文件夹,里面有两层子文件夹。在第二个子文件夹中,有一个 jpg 文件。所有 jpg 都有相同的名称:cover.jpg

例子:

/home/user/folder001/folderAAA/cover.jpg
/home/user/folder002/folderBBB/cover.jpg
[...]
/home/user/folder999/folderZZZ/cover.jpg

我需要找到(并复制到新文件夹)所有cover.jpg文件并重命名它们,在其文件名(作为前缀)中添加第一个和第二个子文件夹的名称。

示例:
在预期的操作之后,ot的内容/home/user1/newfolder必须是:

folder001_folderAAA_cover.jpg
folder002_folderBBB_cover.jpg
[...]
folder999_folderZZZ_cover.jpg

答案1

这可以借助 sed 命令轻松实现。找到需要重命名的文件列表,通过 sed/echo 文件路径就可以达到要求。

cd /home/user
for fl_nm in $(find . -type f -name "cover.jpg")
do
echo copying the file with desired name to new folder : $fl_nm
cp $fl_nm /home/user1/newfolder/$(echo ${i#*/*} | sed 's/\//_/g')
#Above copy command ignores the find result which extracts only file path from ./**file_path**
done

所有名为 cover.jpg 的文件都将被复制到 /home/user1/newfolder,文件名中包含各自的文件夹详细信息。

答案2

#! /bin/bash

target_dir_path="/copy/here"

for file in folder*/*/*.jpg; do
        l1="${file%%/*}"
        l2="${file#*/}"
        l2="${l2%%/*}"
        filename="${file##*/}"
        target_file_name="${l1}_${l2}_${filename}"
        echo cp "$file" "${target_dir_path}/${target_file_name}"
done

echo如果它符合您的要求,请将其删除。

答案3

在 zsh 中,输入autoload zmv在你的.zshrc(或在命令行上运行该命令进行试验),然后:

mkdir /home/user1/newfolder
zmv '/home/user/(*)/(*)/(cover.jpg)' '/home/user1/newfolder/${1}_${2}_${3}'

每个与左侧模式匹配的文件都会被重命名为右侧的替换文本。*意思是“任何字符序列”。在右侧,${1}${2}${3}分别替换为与模式中第一、第二和第三括号组匹配的源路径部分。

您可以请求每个通配符自动成为一个自己的组,而不是使用显式分组:

zmv -w '/home/user/*/*/cover.jpg' '/home/user1/newfolder/${1}_${2}_cover.jpg'

甚至:

zmv -W '/home/user/*/*/cover.jpg' '/home/user1/newfolder/*_*_cover.jpg'

有些甚至添加:

alias zmmv='noglob zmv -W'

到那里~/.zshrc以便能够写:

zmmv /home/user/*/*/cover.jpg /home/user1/newfolder/*_*_cover.jpg

相关内容