¿Cómo comprobar la extensión de un nombre de archivo en un script bash?
Pregunta
Estoy escribiendo un script de compilación nocturno en bash.
Todo está muy bien excepto por 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, probando un archivo de texto.
¿Cómo puedo determinar si un archivo tiene el sufijo .txt?
Solución
Creo que quieres decir "¿Son los últimos cuatro caracteres de $file iguales a .txt
?" Si es así, puedes utilizar lo siguiente:
if [ ${file: -4} == ".txt" ]
Tenga en cuenta que el espacio entre file:
y -4
es obligatorio, ya que el modificador ':-' significa algo diferente.
Otros consejos
Hacer
if [ "$file" == "*.txt" ]
así:
if [[ $file == *.txt ]]
Es decir, corchetes dobles y sin comillas.
El lado derecho de ==
es un patrón de shell.
Si necesita una expresión regular, use =~
entonces.
Simplemente no puede estar seguro en un sistema Unix, que un archivo .txt realmente es un archivo de texto. Su mejor opción es usar & Quot; file & Quot ;. Tal vez intente usar:
file -ib "$file"
Entonces puede usar una lista de tipos MIME para comparar o analizar la primera parte del MIME donde obtiene cosas como " text " ;, " application " ;, etc.
Puede usar el " archivo " comando 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.
También puedes hacer:
if [ "${FILE##*.}" = "txt" ]; then
# operation for txt files here
fi
Similar a 'archivo', use el 'mimetype -b' un poco más simple que funcionará sin importar la extensión del archivo.
if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
echo "this is a text file"
fi
Editar: es posible que necesite instalar libfile-mimeinfo-perl en su sistema si mimetype no está disponible
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:
#!/bin/bash
# flvcache script
CACHE=~/.mozilla/firefox/xxxxxxxx.default/Cache
OUTPUTDIR=~/Videos/flvs
MINFILESIZE=2M
for f in `find $CACHE -size +$MINFILESIZE`
do
a=$(file $f | cut -f2 -d ' ')
o=$(basename $f)
if [ "$a" = "Macromedia" ]
then
cp "$f" "$OUTPUTDIR/$o"
fi
done
nautilus "$OUTPUTDIR"&
Utiliza ideas similares a las presentadas aquí, espero que esto sea útil para alguien.
Supongo que '$PATH_TO_SOMEWHERE'
es algo así como '<directory>/*'
.
En este caso, cambiaría el código a:
find <directory> -maxdepth 1 -type d -exec ... \;
find <directory> -maxdepth 1 -type f -name "*.txt" -exec ... \;
Si desea hacer algo más complicado con el directorio y los nombres de los archivos de texto, puede:
find <directory> -maxdepth 1 -type d | while read dir; do echo $dir; ...; done
find <directory> -maxdepth 1 -type f -name "*.txt" | while read txtfile; do echo $txtfile; ...; done
Si tiene espacios en los nombres de sus archivos, podría:
find <directory> -maxdepth 1 -type d | xargs ...
find <directory> -maxdepth 1 -type f -name "*.txt" | xargs ...
La respuesta correcta sobre cómo tomar la extensión disponible en un nombre de archivo en Linux es:
${strFileName##*\\.}
Ejemplo de impresión de todas las extensiones de archivo en un directorio
for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
do echo ${fname##*\.} #print extensions
done
Mi opinión sobre ello con corte
>cut -d'.' -f2<<<"hi_mom.txt"
txt
Mi opinión sobre awk sería algo como lo siguiente.
>MY_DATA_FILE="my_file.sql"
>FILE_EXT=$(awk -F'.' '{print $NF}' <<< $MY_DATA_FILE)
>if [ "sql" = "$FILE_EXT" ]
>then
> echo "file is sql"
>fi
>awk -F'.' '{print $NF}' <<eof
>hi_mom.txt
>my_file.jpg
>eof