Переименуйте несколько файлов другого имени и расширений с названием родительского каталога

Я пытаюсь выяснить, как переименовать несколько файлов (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;
0
задан 3 January 2019 в 17:54

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" ]: Проверьте, существует ли файл уже и уже был переименован
0
ответ дан 26 October 2019 в 16:57

Другие вопросы по тегам:

Похожие вопросы: