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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top