ubuntu - línea de comando - Cambie el nombre de los archivos según las carpetas principales y muévalos a una nueva ubicación

CorePress2023-09-17  2

Esta pregunta fue cerrada porque no se trata de una versión oficial de Ubuntu. Actualmente no acepta respuestas.

No se trata de una versión oficial de Ubuntu. Se pueden realizar preguntas sobre otras distribuciones de Linux en Unix y Linux. Linux, los de Windows en Super Usuario, aquellos sobre productos Apple en Ask Different y preguntas de programación genéricas en Stack Overflow.

Cerrado Hace 5 años.

mejorar esta pregunta

Tengo una estructura de directorios como esta:

./BBC_english/

 2017-09-19.20.00.3-0.rec/00001.mpeg
 2017-09-19.21.00.3-0.rec/00001.mpeg
 2017-09-19.22.00.3-0.rec/00001.mpeg
 2017-09-19.23.00.3-0.rec/00001.mpeg

Y necesito cambiar el nombre de 00001.mpeg como carpeta principal de esta manera para cada carpeta en ./ Necesito la fecha y la hora de grabación en este formato, por ejemplo; no necesito 2017 en el nuevo archivo nombres

Y al final yonecesita mover todos los archivos mpeg renombrados a una nueva ruta como esta:

./newpath/

BBC_english__09-19__20.00.mpeg   
BBC_english__09-19__21.00.mpeg    
BBC_english__09-19__22.00.mpeg
BBC_english__09-19__23.00.mpeg

En primer lugar, uso Fedora 20 (sé que aquí está el foro de Ubuntu) y cuando ejecuto el comando mv no admite la opción -v y solo tengo estas opciones:

-f -i -n

Y debes saber que en la ruta de origen mi grabador de vídeo crea un archivo nuevo cada hora.

Entonces necesito una secuencia de comandos recursiva para hacer eso para todos los archivos en la carpeta de origen solo para el archivo .mpeg (después usaré la secuencia de comandos que funcionó para mí en cron) pero ninguna de las secuencias de comandos que envías aquí funciona para mí ahora.

  • 1 Esto le ayudará a cambiar el nombre de los archivos según el nombre de sus carpetas principales. - Ruso 20 de septiembre de 2017 a las 11:31
  • Diría que no es del todo duplicado de lo que @dessert vinculó. La pregunta vinculada solicita agregar el nombre del directorio al nombre del archivo (el OP de esa publicación decía "...agregando el nombre de la carpeta antes del nombre actual"). Esta pregunta solicita moverse a una nueva ubicación con la ubicación anterior agregada al nombre del archivo Y modificar el nombre del archivo en algunos lugares. Preguntas muy diferentesciones, amigos! - Sergiy Kolodyazhnyy 21 de septiembre de 2017 a las 8:22
  • 1 @SergiyKolodyazhnyy todavía fuera de tema.-muru 21 de septiembre de 2017 a las 8:26
  • @dessert Parcialmente, podría ser útil, pero la pregunta y las soluciones son diferentes, y esos son dos componentes clave. Intentar aplicar respuestas duplicadas para que coincidan con esta pregunta no funcionará. Marcar como "duplicado" implica que las soluciones debenfunciona para cualquier caso. La publicación se puede vincular en los comentarios como útil, pero si las soluciones no funcionan, no es un duplicado válido. - Sergiy Kolodyazhnyy 21 de septiembre de 2017 a las 8:43
  • 1@lockheed Además de proporcionar toda la información que solicité en mi comentario sobre la respuesta de Sergiy Kolodyazhnyy en su edición, si es posible, agregue también el texto completo. salida de sh --help, mv --help, uname -a, cat /etc/issue y cat /etc/lsb-release, a su pregunta. Está bien si algunos son mensajes de error. Ejecútelos desde la máquina VDR, ya que esa es la máquina en la que desea cambiar el nombre de los archivos y en la que no puede utilizar las respuestas que se han publicado hasta ahora. (Si no lo entiendo bien, explíquelo también). - Eliah Kagan 21 de septiembre de 2017 a las 10:46


------------Respuesta------------

Ya que mencionaste que tienes Fedora, aquí tienes un script de Python, que usa la sintaxis de Python 2, que debería funcionar sin problemas ni diferencias tanto en Ubuntu como en Fedora. (Sería bueno usar el prenombre que los derivados de Debian incluyen de forma predeterminada, pero desafortunadamente Fedora no lo hace. Lo dejaré como un ejercicio para el futuro, y el prenombre sigue siendo útil para los usuarios de Ubuntu).

Aquí está el guión en sí:

#!/usr/bin/env python

import os
import sys
import shutil

def find_files(start_dir):
    ext_paths = []
    for root,dirs,files in os.walk(start_dir):
        if root == start_dir: continue        
        ext_paths = ext_paths + map( lambda x: os.path.join(root,x),files )
    return ext_paths

def alter_path(path,new_dir):
    newpath = path.replace(".3-0.rec/00001","").replace("2017-","")
    newpath = newpath.replace("BBC_english/","BBC_english__").replace("19.","19__")
    return os.path.join(new_dir,newpath)    

def main():
    for i in find_files(sys.argv[1]):
        print(i,alter_path(i,sys.argv[2]))
        shutil.copy(i,alter_path(i,sys.argv[2]))

if __name__ == '__main__':
    main()

Aquí está en acción:

$ ./rename_mpegs.py  BBC_english/ newpath/                                                                                        
('BBC_english/2017-09-19.23.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__23.00.mpeg')
('BBC_english/2017-09-19.20.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__20.00.mpeg')
('BBC_english/2017-09-19.22.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__22.00.mpeg')
('BBC_english/2017-09-19.21.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__21.00.mpeg')
$ tree newpath/                                                                                                                   
newpath/
├── BBC_english__09-19__20.00.mpeg
├── BBC_english__09-19__21.00.mpeg
├── BBC_english__09-19__22.00.mpeg
└── BBC_english__09-19__23.00.mpeg

Te sugiero que reemplaces la parte Shutil.copy() con Shutil.move(), o simplemente puedes deshacerte del directorio antiguo al final, pero lo dejaré.Eso depende de ti.

Las reglas son simples: llame al script con el origen como argumento 1 y el destino como argumento 2 al script desde el directorio un nivel superior a BBC_english. En general, el script es rápido y sencillo, el cambio de nombre está codificado; Se diría que no es ideal, pero funciona.


  • muchas gracias hermano, pero desafortunadamente usé una PC con caja negra para mi VDR que no puede ejecutar scripts de Python en eso (lista de comandos antigua y limitada). Así que prefiero almorzar comandos en está en modo de comando original. Además, no tiene conexión a Internet (VDR aislado) Lockheed 21 de septiembre de 2017 a las 8:54
  • 1 @lockheed Mencionaste Fedora 20, pero la máquina que no admite Python o mv -v no es Fedora, ¿verdad? Al igual que Ubuntu, Fedora tiene GNU Coreutils mv que admite -v. Si la máquina ejecuta una distribución integrada,Probablemente use BusyBox para su shell y la mayoría de los comandos, especialmente porque BusyBox mv solo admite -f, -i y -n. Si edita los detalles de su pregunta: la marca de la máquina, el modelo, el SO/versión (si es posible), cómo accede a ella (¿SSH? ¿Desde Fedora?) y con qué frecuencia El cambio de nombre debe ocurrir (¿también una vez por hora?). Creo que podemos migrarlo a Unix y Linux, donde está en el tema. - Eliah Kagan 21 de septiembre de 2017 a las 10:25
  • @Eliah Kagan sí, veo una casilla ocupada. Es una versión ligera de Fedora, pero v no está en las opciones. Además, es ligera y solo está instalado el script VDR para grabar canales de televisión. Utilizo ssh para conectarme a través del cambio de nombre de PuTTY, creo que puedo ejecutar vua cron para llamar al script sh. Soy nuevo en este sitio. Si prefieres migrar a otro, dímelo. Lockheed 21 de septiembre de 2017 a las 18:01
  • 1 @lockheed No dudes en publicar esto en otro lugar. Pero, tal como está escrito, probablemente (a) obtenga respuestas que no tengan en cuenta las limitaciones con las que está trabajando, como sucedió aquí en Ask Ubuntu, o (b) cerrarse por no estar claro. Una vez que describa completamente lo que necesita, su pregunta podrá migrarse a Unix y Linux, sin que tenga que volver a publicarla. Si crees queSi lo desea, debe hacer clic en el enlace editar directamente debajo de su pregunta y agregar la información que proporcionó aquí en su comentario, así como los demás detalles que solicité. en mis comentarios anteriores aquí y sobre la pregunta. - Eliah Kagan 22 de septiembre de 2017 a las 10:56


------------Respuesta------------

Como sugiere heemayl en respuesta a la publicación vinculada, podrías usar una serie de expansiones de shell.

Asumiendo que el directorio de trabajo actual es el padre de ambos directorios.Fuente y destino, puedes usar este bucle en un sistema Ubuntu:

$ for d in ./BBC_english/*; do e="${d##*2017-}"; f="${e%%.[0-9]-[0-9].rec}"; g="${f/./__}"; echo mv -v -- "$d"/* ./newpath/BBC_english__"$g".mpeg; done
mv -v -- ./BBC_english/2017-09-19.20.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__20.00.mpeg
mv -v -- ./BBC_english/2017-09-19.21.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__21.00.mpeg
mv -v -- ./BBC_english/2017-09-19.22.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__22.00.mpeg
mv -v -- ./BBC_english/2017-09-19.23.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__23.00.mpeg

Tenga en cuenta que recorremos los directorios en lugar de los archivos. Esto supone que en realidad solo tienes un archivo en cada directorio, lo que parece ser el caso dada la lógica.

Elimine el eco después de probar para mover archivos. Entonces -v hace que mv informe lo que está haciendo.

Si su mv no admite el indicador -v (detallado) y desea ver qué sucede, puede hacer que bash sea detallado y brindarle un resumen detallado de lo que está haciendo usando set -x

#!/bin/bash
set -x

for d in ./BBC_english/*; do 
   e="${d##*2017-}"            # remove everything before and including 2017-
   f="${e%%.[0-9]-[0-9].rec}"  # remove the trailing numbers and `.rec`
   g="${f/./__}"               # replace the first `.` with `__`
 echo mv -- "$d"/* ./newpath/BBC_english__"$g".mpeg
 # move to the new path using the edited directory name
done

El resultado de esto después de eliminar echo incluiría el resultado de cada expansión y la declaración mv para cada iteración del bucle. Para la primera iteración, el resultado se vería así:

+ for d in ./BBC_english/*
+ e=09-19.20.00.3-0.rec
+ f=09-19.20.00
+ g=09-19__20.00
+ mv -- ./BBC_english/2017-09-19.20.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__20.00.mpeg

  • Yo diría que hagas el último códigocorte un script completo, agregue #! línea a ello. Además, vale la pena señalar para n00bz que./ significa que se debe ejecutar dicho comando desde el directorio un nivel superior a BBC_english. - Sergiy Kolodyazhnyy 21 de septiembre de 2017 a las 8:18
  • 1tema antiguo, ya hemos hablado de esto miles de veces. La pregunta sigue siendo útil para los usuarios de Ubuntu. Mientras funcione en nuestra plataforma, eso es lo único que importa. - Sergiy Kolodyazhnyy 21 de septiembre de 2017 a las 8:24


------------Respuesta------------

Este script debería ayudar:

#!/bin/bash  

for i in ./BBC_english/*; do
        # Get the path to the file
        path=$(dirname "$(readlink -f "$i")")         

        # get the names for file rename
        f2=$( echo "$path" | grep -Eo "\-[0-9]{2}-[0-9]{2}" | grep -Eo "[0-9]{2}-[0-9]{2}")            
        f1=$( echo "$path" | grep -Eo BBC_english )           
        f3=$(echo "$path" | grep -Eo "\.[0-9]{2}\.[0-9]{2}" | grep -Eo "[0-9]{2}\.[0-9]{2}")                       
        # Rename the files           
        mv -n "$i" ./newpath/"$f1"__"$f2"__"$f3".mpeg

done

  • 1 cambio el parámetro de opción de -v a -n pero todavía tengo un problema. El script mueve todas las carpetas del origen al destino, pero no veo ningún efecto de cambio de nombre en el archivo en nueva ruta. también necesita corregir esta línea "$f3.txt y cambiarla a "$f3".txt Lockheed 21 de septiembre de 2017 a las 5:41
  • Perdón por la falta " y la extensión debería haber sido mpeg (probé con .text), la probé y funciona por mi parte. Es posible que deba cambiar las rutas para que funcione. Y fedora está fuera de tema aquí - George Udosen 21 de septiembre de 2017 a las 6:30
  • ¿Se cambió el nombre de sus archivos a este estilo en la nueva ruta? BBC_english__09-19__20.00.mpeg ?? Guardé este script en un archivo .sh en el directorio principal /BBC_English y lo ejecuté. Lockheed 21 de septiembre de 2017 a las 6:46
  • Sí, pero en mi caso usé bbc en lugar de BBC_english. - George Udosen 21 de septiembre de 2017 a las 6:47
  • Si ignoramos el movimiento y otros comandos, ¿puede decirme cómo puedo filtrar y elegir el nombre de la carpeta principal y tomar algunos caracteres de fecha y hora para el nuevo archivo? Necesito el comando de filtrado para el nuevo nombre de archivo solo ahora. Como 2017-09-19.20.00.3-0.rec, necesito entender BBC-english_09-19_20.00. de hecho, necesito el estilo (satname_date_time) sin 2017 al principio y .3-0.rec al final del nuevo nombre de archivo Lockheed 21 de septiembre de 2017 a las 7:05