Я пытаюсь выяснить, как переименовать несколько файлов (100 с), которые имеют различные расширения их соответствующего имени подкаталога. Вот структура:
Parentdir
|--subdir1
|---name1.txt
|---name2.jpeg
|--name3.ovc
|--subdir2
|--name4.txt
|--name5.tiff
|-name6.mpeg
то, что я хотел бы сделать, является пакетной обработкой переименовывание всех файлов в их соответствующем имени subdir при поддержании их расширения.
Из родительского каталога я использовал эту команду, но у меня есть проблемы с расширениями файла:
for subdir in *; do mv $subdir/* $subdir.mpeg; done;
Я заклинал этот сценарий, который может помочь достигнуть того, что Вы хотите:
#!/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" ]
: Проверьте, существует ли файл уже и уже был переименован