使用父文件夹名称重命名子文件夹中的文件

使用父文件夹名称重命名子文件夹中的文件

我有一个主目录,里面有四个文件夹,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)))

相关内容