Я все еще новичок в написании сценариев оболочки, поэтому уверен, что эта команда совершенно неправильная. Я пытаюсь переименовать папку с файлами в имена из файла txt. Предварительным условием является то, что filenames.txt и файлы в папке уже организованы так, чтобы первая строка соответствовала первому файлу в системе. Вот что я получил:
while read line; do echo -e "$line\n" | for f in *mkv do mv f $1; done < filenames.txt
но это не сработало. Можете ли вы мне помочь это исправить?
Спасибо
решение1
Если у вас нет алгоритмического правила для переименования файлов (т.е. вам действительно нужен файл в качестве входных данных), я бы предложил
создайте текстовый файл из списка файлов, которые вы хотите переименовать, например:
найти . -имя "*.mkv" > файлы.txt
отредактируйте этот файл и добавьте новое имя после старого в каждой строке, например:
./мойпервый.mkv ./мойновыйпервый.mkv
обработать этот файл:
пока читается строка; сделать 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
строкой , чтобы проверить, что это сделает то, что вам нужно.
Кроме того, я мог бы попробовать сделать это по-другому... Я не уверен, как вы генерируете файл с новыми именами, но, как предполагает другой ответ, вы можете пройтись по файлу старых и новых имен или просто прочитать имена и применить некоторую логику для создания новых имен.