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.
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 comandofind
.Aquí tienes un ejemplo de cómo puedes modificar tu script para usar el comando
find
: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:
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_originalelse
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.>