es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bash realizando diferentes acciones para diferentes tipos de archivos, para todos los archivos en el directorio.

Quiero cambiar el título meta de todas mis películas en un directorio y sus subdirectorios.

for file in *; do 
if [[ $file == *.mkv ]]
then
    mkvpropedit --set "title=$file" "$file"; 
elif [[ $file == *.mp4 ]]
then
    exiftool "-Title<Filename" *.mp4 -overwrite_original -r
else
    echo "$file nombre de archivo incorrecto"
fi
done

Esa es mi idea general hasta ahora, pero no encuentra los archivos. Los comandos deberían funcionar, pero las condiciones if ni siquiera se entran. Además, solo usar * no busca subdirectorios.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con el script actual que has compartido.

    En primer lugar, como has mencionado, el * no buscará archivos en subdirectorios. Para buscar archivos en subdirectorios, puedes usar el comando find.

    Aquí tienes un ejemplo de cómo puedes modificar tu script para usar el comando find:

    find /ruta/hasta/directorio -type f \( -name \*.mkv -o -name \*.mp4 \) -print0 | while read -d $'\0' archivo
    do
        # El resto del script va aquí
    done
    

    En este script modificado, estamos usando el comando find para localizar todos los archivos en el directorio y sus subdirectorios que tienen la extensión .mkv o .mp4. Luego estamos usando la opción -print0 para asegurarnos de que cualquier espacio o carácter especial en los nombres de los archivos se manejen correctamente. Estamos enviando la salida del comando ‘find’ al bucle ‘while’ que leerá cada archivo y ejecutará los comandos relevantes.

    En segundo lugar, en el script actual, estás comparando el nombre del archivo con *.mkv y *.mp4 usando el operador ==. Sin embargo, este operador solo se usa para comparaciones de cadenas y no para coincidencia de patrones. Para hacer coincidir patrones, puedes usar el operador =~ con una expresión regular.

    Aquí tienes un ejemplo de cómo puedes modificar tu script para usar expresiones regulares:

    if [[ $archivo =~ \.mkv$ ]]
    then
        mkvpropedit --set "title=$archivo" "$archivo"
    elif [[ $archivo =~ \.mp4$ ]]
    then
        exiftool "-Title<filename" "$archivo" -overwrite_original
    else
        echo "$archivo nombre de archivo incorrecto"
    fi
    

    en este script modificado, estamos verificando si el nombre del archivo coincide con la expresión regular \ .mkv $ o \ .mp4 $. el . se escapa con una barra invertida para coincidir con el carácter . literal. el $ indica que el patrón debe coincidir al final de la cadena. si el nombre del archivo coincide con alguno de los patrones, ejecutamos los comandos relevantes.

    espero que esto te ayude a modificar tu script para cumplir con tus requisitos. “$archivo”=”” -overwrite_original=”” else=”” echo=”” “$archivo=”” nombre=”” de=”” archivo=”” incorrecto”=”” fi=”” en=”” este=”” script=”” modificado,=”” estamos=”” verificando=”” si=”” el=”” nombre=”” del=”” archivo=”” coincide=”” con=”” la=”” expresión=”” regular=”” \="" .mkv="" $=”” o=”” \="" .mp4="" $.=”” el=”” .=”” se=”” escapa=”” con=”” una=”” barra=”” invertida=”” para=”” coincidir=”” con=”” el=”” carácter=”” .=”” literal.=”” el=”” $=”” indica=”” que=”” el=”” patrón=”” debe=”” coincidir=”” al=”” final=”” de=”” la=”” cadena.=”” si=”” el=”” nombre=”” del=”” archivo=”” coincide=”” con=”” alguno=”” de=”” los=”” patrones,=”” ejecutamos=”” los=”” comandos=”” relevantes.=”” espero=”” que=”” esto=”” te=”” ayude=”” a=”” modificar=”” tu=”” script=”” para=”” cumplir=”” con=”” tus=””></filename” “$archivo” -overwrite_original
    else
    echo “$archivo nombre de archivo incorrecto”
    fi

    en este script modificado, estamos verificando si el nombre del archivo coincide con la expresión regular \ .mkv $ o \ .mp4 $. el . se escapa con una barra invertida para coincidir con el carácter . literal. el $ indica que el patrón debe coincidir al final de la cadena. si el nombre del archivo coincide con alguno de los patrones, ejecutamos los comandos relevantes.

    espero que esto te ayude a modificar tu script para cumplir con tus requisitos.>

Comments are closed.