Estoy escribiendo un script de compilación nocturno en bash.
Todo está bien y elegante a excepción de un pequeño inconveniente:
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
Mi problema es determinar la extensión del archivo y luego actuar en consecuencia. Sé que el problema está en la declaración if, que prueba un archivo txt.
¿Cómo puedo determinar si un archivo tiene un sufijo .txt?
$(dirname $PATH_TO_SOMEWHERE)
y$(basename $PATH_TO_SOMEWHERE)
dividir en carpeta y directorio y hacer algo directorio-ish y file-ishRespuestas:
Creo que quiere decir "¿Son iguales los últimos cuatro caracteres del archivo $
.txt
?" Si es así, puede usar lo siguiente:Tenga en cuenta que el espacio entre
file:
y-4
es obligatorio, ya que el modificador ': -' significa algo diferente.fuente
${var:-4}
no es lo mismo que${var: -4}
; el primero (sin espacio) se expandirá como '-4' si var está desarmado el segundo (con un espacio) devuelve los últimos 4 caracteres de var.if [ "${file: -4}" == ".txt" ]
cambio.Hacer
Me gusta esto:
Es decir, corchetes dobles y sin comillas.
El lado derecho de
==
es un patrón de concha. Si necesita una expresión regular, use=~
entonces.fuente
if
declaración condicional múltiple . Lo estoy compartiendo aquí en caso de que ayude a alguien.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. Es más corto, más claro, más fácil de agregar extensiones adicionales y se puede configurar fácilmente (poniendo "csv | png" en una variable).if [[ "$file" == *.txt ]]
Si el archivo tiene espacios en su nombre, se requieren comillas dobles.Simplemente no puede estar seguro en un sistema Unix, que un archivo .txt realmente es un archivo de texto. Su mejor apuesta es usar "archivo". Quizás intente usar:
Luego, puede usar una lista de tipos MIME para comparar o analizar la primera parte del MIME donde obtiene cosas como "texto", "aplicación", etc.
fuente
file -i...
incluye la codificación mime, puede usarfile --mime-type -b ...
Puede usar el comando "archivo" si realmente desea obtener información sobre el archivo en lugar de confiar en las extensiones.
Si se siente cómodo con el uso de la extensión, puede usar grep para ver si coincide.
fuente
file
comando. En realidad, intenté hacer coincidir en función de la salida de dicho comando ... pero fallé horriblemente en estas declaraciones if.También puedes hacer:
fuente
case $FILE in *.txt ) ... ;; esac
parecería más robusto e idiomático.Similar a 'archivo', use el 'mimetype -b' un poco más simple que funcionará sin importar la extensión del archivo.
Editar: es posible que deba instalar libfile-mimeinfo-perl en su sistema si mimetype no está disponible
fuente
La respuesta correcta sobre cómo tomar la extensión disponible en un nombre de archivo en Linux es:
Ejemplo de imprimir todas las extensiones de archivo en un directorio
fuente
Escribí un script bash que analiza el tipo de archivo y luego lo copia en una ubicación, lo uso para ver los videos que he visto en línea desde mi caché de Firefox:
Utiliza ideas similares a las presentadas aquí, espero que esto sea útil para alguien.
fuente
Supongo que
'$PATH_TO_SOMEWHERE'
es algo como'<directory>/*'
.En este caso, cambiaría el código a:
Si desea hacer algo más complicado con el directorio y los nombres de los archivos de texto, puede:
Si tiene espacios en sus nombres de archivo, podría:
fuente
for
y loswhile
bucles deben reservarse para cuando el cuerpo del bucle debe ser más complejo.