1

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

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

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

Спасибо

2 ответа2

2

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

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

    находить . -name "* .mkv"> files.txt

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

    ./myfirst.mkv ./mynewfirst.mkv

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

    пока читаешь строку; do eval mv $ line; готово <files.txt

0

Я черпаю вдохновение здесь: 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 чтобы проверить, что это будет делать то, что вы хотите.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .