
Todavía soy muy nuevo en los scripts de shell, así que estoy seguro de que este comando es incorrecto. Estoy intentando cambiar el nombre de una carpeta de archivos a los nombres de un archivo de texto. La condición previa es que los nombres de archivo.txt y los archivos de la carpeta ya estén organizados para que coincidan con la primera línea con el primer archivo del sistema. Lo que obtuve fue:
while read line; do echo -e "$line\n" | for f in *mkv do mv f $1; done < filenames.txt
pero no funcionó. ¿Pueden ayudarme a corregirlo?
Gracias
Respuesta1
Si no tiene una regla algorítmica para cambiar el nombre de los archivos (es decir, realmente necesita un archivo como entrada), le sugiero que
cree un archivo txt a partir de la lista de archivos cuyo nombre desea cambiar, por ejemplo:
encontrar . -nombre "*.mkv" > archivos.txt
edite este archivo y agregue el nuevo nombre después del anterior en cada línea, por ejemplo
./miprimer.mkv ./minuevoprimero.mkv
procesar este archivo:
mientras lee la línea; hacer evaluación mv $línea; hecho <archivos.txt
Respuesta2
Me inspiro en aquí:https://unix.stackexchange.com/a/26604
Parece que necesita recorrer tanto el archivo como los archivos en el directorio al mismo tiempo:
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
No sé si tiene el nombre del directorio en el filenames.txt
archivo, por lo que es posible que desee poner un echo
antes de la mv
línea para probar que esto hará lo que desea.
Además, podría intentar hacer esto de otra manera... No estoy seguro de cómo estás generando el archivo con los nuevos nombres, pero como sugiere otra respuesta, puedes recorrer un archivo de nombres antiguos y nuevos o simplemente leer los nombres y aplicar algo de lógica para crear los nuevos nombres.