Переименование файлов из списка имен файлов

Переименование файлов из списка имен файлов

Я все еще новичок в написании сценариев оболочки, поэтому уверен, что эта команда совершенно неправильная. Я пытаюсь переименовать папку с файлами в имена из файла txt. Предварительным условием является то, что filenames.txt и файлы в папке уже организованы так, чтобы первая строка соответствовала первому файлу в системе. Вот что я получил:

while read line; do echo -e "$line\n" | for f in *mkv do mv f $1; done < filenames.txt

но это не сработало. Можете ли вы мне помочь это исправить?

Спасибо

решение1

Если у вас нет алгоритмического правила для переименования файлов (т.е. вам действительно нужен файл в качестве входных данных), я бы предложил

  1. создайте текстовый файл из списка файлов, которые вы хотите переименовать, например:

    найти . -имя "*.mkv" > файлы.txt

  2. отредактируйте этот файл и добавьте новое имя после старого в каждой строке, например:

    ./мойпервый.mkv ./мойновыйпервый.mkv

  3. обработать этот файл:

    пока читается строка; сделать eval mv $line; сделано < files.txt

решение2

Я черпаю вдохновение отсюда:https://unix.stackexchange.com/a/26604

Похоже, вам нужно одновременно выполнить цикл по файлу и файлам в каталоге:

DIR=./thefiledir
while : ; do
    read -r oldfile <&3
    read -r newfile <&4
    if [ -z "$oldfile" -o -z "$newfile" ]; then
        break
    fi
    mv $oldfile $newfile
done 3< <( find $DIR -maxdepth 1 -type f | sort ) 4< filenames.txt

Я не знаю, есть ли у вас имя каталога в filenames.txtфайле, поэтому вы можете добавить echoперед mvстрокой , чтобы проверить, что это сделает то, что вам нужно.

Кроме того, я мог бы попробовать сделать это по-другому... Я не уверен, как вы генерируете файл с новыми именами, но, как предполагает другой ответ, вы можете пройтись по файлу старых и новых имен или просто прочитать имена и применить некоторую логику для создания новых имен.

Связанный контент