我有一个主目录,里面有四个文件夹,f1, f2, f3 and f4
每个文件夹又有 10 个文件夹,每个文件夹里ff1...ff10
都有一些.jpeg
图像,图像的名称可以称为image1
... 等等。我想知道如何重命名每个文件夹中的 10 个文件夹中的这些 .jpeg 图像f1, f2, f3 and f4
,这样我就可以将其父文件夹连接到其名称的开头,例如image1.jpeg
位于f3/ff1
那么它的名称将是f3_ff1_image1.jpeg
,与四个主文件夹中其他 10 个文件夹中的所有其他图像相同。如果有人可以告知如何在文件中完成此操作.sh
。
答案1
使用循环和一些 bash 字符串操作
while read -rd $'\0' f; do
d="${f%/*}"; p="${d/\//_}";
echo mv -- "$f" "${d}/${p}_${f##*/}"
done < <(find -type f -name '*.jpeg' -printf '%P\0')
(echo
确认文件正确匹配后删除)
使用基于 perl 的rename
命令和 bashglobstar
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
(-nv
确认文件正确匹配后删除)
答案2
创建一个简单的文件changeName.sh
如下:
#!/bin/bash
fileName=$(basename $1)
filepath=$(dirname $1)
secondDir=$(basename $filepath)
firstDir=$(basename $(dirname $filepath))
parentDir=$(basename $(dirname $(dirname $filepath)))
mv $1 $filepath/${parentDir}_${firstDir}_${secondDir}_$fileName
保存它,例如在 中/home/yourUser/bin
。
更改权限为changeName.sh
:
chmod +x /home/yourUser/bin/changeName.sh
打开/home/yourUser/.bashrc
文件并在末尾添加以下行:
PATH=$PATH:/home/yourUser/bin
保存并重新加载:
source .bashrc
现在您有一个新的实用程序,可以使用文件夹作为名称的一部分将名称更改为文件。
尝试这个:
find mainDirectory -name "*.jpeg" -exec changeName.sh {} \;
mainDirectory
可以是绝对的,也可以是相对的。
在 lubuntu 12.04 上测试
目录名从文件名中删除最后一个组件基名从文件名中删除目录和后缀。
因此要获取第三级目录:
parentDir=$(basename $(dirname $(dirname $filepath)))