我有一个文件夹,里面有两层子文件夹。在第二个子文件夹中,有一个 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