使用父目录名称重命名具有不同名称和扩展名的多个文件

使用父目录名称重命名具有不同名称和扩展名的多个文件

我正在尝试弄清楚如何将具有不同扩展名的多个文件(100 个)重命名为其各自的子目录名称。结构如下:

Parentdir
  |--subdir1 
    |---name1.txt
    |---name2.jpeg
    |--name3.ovc
  |--subdir2
    |--name4.txt
    |--name5.tiff
    |-name6.mpeg

我想要做的是批量处理其各自子目录名称内的所有文件的重命名,同时保留它们的扩展名。

我从父目录中使用了此命令,但遇到了文件扩展名的问题:

for subdir in *; do mv $subdir/*  $subdir.mpeg; done;

答案1

我想出了这个脚本来帮助实现你想要的目标:

#!/usr/bin/env bash
set -e

for i in "$1"/*/*
do
    old="${i##*/}"
    ext="${i##*.}"
    name=$(basename "${i%/*}")
    [ ! -d "$i" ] && [ ! -f "$1/$name/$name.$ext" ] && mv "$1/$name/$old" "$1/$name/$name.$ext"

done

测试:

parentdir
├── subdir1
│   ├── name1.ovc
│   └── name1.txt
└── subdir2
    ├── name2.ovc
    └── name2.txt

结果:

parentdir
├── subdir1
│   ├── subdir1.ovc
│   └── subdir1.txt
└── subdir2
    ├── subdir2.ovc
    └── subdir2.txt

用法:./script.sh Parentdir

信息:

  • old="${i##*/}":返回要更改的文件名(name1.ovc)
  • ext="${i##*.}":返回文件扩展名(mpeg、txt)
  • name=$(basename "${i%/*}"):返回目标文件的直接父目录(subdir1)
  • [ ! -d "$i" ]:检查是否不是目录
  • [ ! -f "$1/$name/$name.$ext" ]:检查文件是否已经存在并且已被重命名

相关内容