копирование имен файлов из файлов одной папки в файлы другой через bash - PullRequest
0 голосов
/ 08 февраля 2020

У меня много разных папок с одинаковым количеством файлов в одинаковом порядке. Например:

Folder1              Folder2            Folder3
  AFile.jpg            9001.jpg           13004.jpg
  BFile.jpg            9002.jpg           13005.jpg
  Cfile.jpg            9003.jpg           13006.jpg

Я хочу скопировать имена файлов Folder1 во все остальные папки, чтобы получить следующий результат:

Folder1              Folder2            Folder3
  AFile.jpg            AFile.jpg          AFile.jpg
  BFile.jpg            BFile.jpg          BFile.jpg
  Cfile.jpg            Cfile.jpg          Cfile.jpg

Однако каждое предложение переименовать несколько файлов переименовывает только несколько файлы, использующие одну и ту же строку замены.

Есть ли возможность сделать это с помощью сценария bash?

1 Ответ

0 голосов
/ 08 февраля 2020

Вот несколько тестовых каталогов и файлов, просто чтобы показать один из способов сделать это.

Создание каталогов.

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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...