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 preguntaTengo 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.
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.
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
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