Вот несколько тестовых каталогов и файлов, просто чтобы показать один из способов сделать это.
Создание каталогов.
mkdir Folder{1..3}
Создание файлов внутри каталогов.
touch Folder1/{A..C}file.jpg
touch Folder2/{9001..9003}.jpg
touch Folder3/{13004..13006}.jpg
Проверка файлов.
ls Folder{1..3}
Вывод
Folder1:
Afile.jpg Bfile.jpg Cfile.jpg
Folder2:
9001.jpg 9002.jpg 9003.jpg
Folder3:
13004.jpg 13005.jpg 13006.jpg
Сценарий
#!/usr/bin/env bash
f1=(Folder1/*.jpg)
for dir in Folder{2..3}; do
( cd "$dir/" || exit; files=(*.jpg); for i in "${!f1[@]}"; do mv -v ${files[$i]}" "${f1[$i]##*/}"; done )
done
Вывод сценария.
renamed '9001.jpg' -> 'Afile.jpg'
renamed '9002.jpg' -> 'Bfile.jpg'
renamed '9003.jpg' -> 'Cfile.jpg'
renamed '13004.jpg' -> 'Afile.jpg'
renamed '13005.jpg' -> 'Bfile.jpg'
renamed '13006.jpg' -> 'Cfile.jpg'
Снова проверьте файлы.
ls Folder{1..3}
The output
Folder1:
Afile.jpg Bfile.jpg Cfile.jpg
Folder2:
Afile.jpg Bfile.jpg Cfile.jpg
Folder3:
Afile.jpg Bfile.jpg Cfile.jpg
Краткое объяснение Сохраните файлы * .jpg в массиве из Folder1
f1=(Folder1/*.jpg)
cd внутри Folder2 и Folder3, используя al oop и завершите работу, если произойдет сбой cd, поэтому сценарий завершится немедленно.
сохраните файлы *.jpg
в папках 2 и 3 в массиве с именем files
files=(*.jpg)
L oop через индексы f1
и files
массивы !
из "${!f1[@]}"
- вот что это делает.
"${f1[$i]##*/}"
форма PE (расширение параметров), которая удаляет имя пути из имени файла.
Код внутри ( )
работает в подоболочке, поэтому вам не нужно go возвращаться обратно предыдущий каталог Вы запустили скрипт.
( cd "$dir"/ || exit; files=(*.jpg); for i in "${!f1[@]}"; do mv -v "${files[$i]}" "${f1[$i]##*/}"; done )