我正在尝试弄清楚如何将具有不同扩展名的多个文件(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" ]
:检查文件是否已经存在并且已被重命名