verificar validar todos tipos tipo son scripts script saber resueltos que programas programacion permite para otro mover manipulación maneja los formato fichero extension existencia existe ejercicios ejemplos ejecutables directorios directorio detectar cuáles como comandos comando basicos archivos archivo linux bash shell

linux - validar - Compruebe si existe un determinado tipo de archivo/extensión en el directorio



verificar si existe un archivo en linux (12)

¿Cómo diría si los archivos de una extensión específica están presentes en un directorio, con bash?

Algo como

if [ -e *.flac ]; then echo true; fi


Aquí hay una solución que no utiliza comandos externos (es decir, no ls ), sino una función de shell. Probado en bash:

shopt -s nullglob function have_any() { [ $# -gt 0 ] } if have_any ./*.flac; then echo true fi

La función have_any usa $# para contar sus argumentos, y [ $# -gt 0 ] luego prueba si hay al menos un argumento. El uso de ./*.flac lugar de solo *.flac en la llamada a have_any es evitar problemas causados ​​por archivos con nombres como --help .


Debe tener cuidado con la bandera que lanza en su declaración if , y cómo se relaciona con el resultado que desea.

Si desea verificar solo los archivos normales y no otros tipos de entradas del sistema de archivos, querrá cambiar el código de su código para:

if [ -f file ]; then echo true; fi

El uso de -f restringe el if a los archivos regulares, mientras que -e es más amplio y coincidirá con todos los tipos de entradas del sistema de archivos. Por supuesto, hay otras opciones como -d para directorios, etc. Vea http://tldp.org/LDP/abs/html/fto.html para obtener una buena lista.

Como lo señaló @msw, la test (es decir, [ ) se ahogará si intenta y le da más de un argumento. Esto podría suceder en su caso si el glob para *.flac devolvió más de un archivo. En ese caso, intente ajustar su prueba if en un bucle como:

for file in ./*.pdf do if [ -f "${file}" ]; then echo ''true''; break fi done

De esta manera, se break en la primera instancia de la extensión de archivo que desea y puede continuar con el resto del script.


Esto usa ls (1), si no existen archivos flac, ls informa de un error y el script sale; Por lo tanto, el script continúa y los archivos pueden ser procesados.

#! /bin/sh ls *.flac >/dev/null || exit ## Do something with flac files here


La solución superior (if [ -e *.flac ];) no me funcionó, por lo que: [: too many arguments

if ls *.flac >/dev/null 2>&1; entonces funcionará.


Para completar, con zsh:

if [[ -n *.flac(#qN) ]]; then echo true fi

Esto se enumera al final de la sección Expresiones condicionales en el manual de zsh. Ya que [[ deshabilita el nombre de archivo, necesitamos forzar la generación de nombre de archivo usando (#q) al final de la cadena de código, luego la NULL_GLOB N (opción NULL_GLOB ) para forzar que la cadena generada esté vacía en caso de que no haya coincidencia.


Puede usar -f para verificar si existen archivos de un tipo específico:

#!/bin/bash if [ -f *.flac ] ; then echo true fi


solo bash

any_with_ext () ( ext="$1" any=false shopt -s nullglob for f in *."$ext"; do any=true break done echo $any ) if $( any_with_ext flac ); then echo "have some flac" else echo "dir is flac-free" fi

Utilizo paréntesis en lugar de llaves para garantizar que se use una subshell (no quiero nullglob configuración actual de nullglob ).


#!/bin/bash count=`ls -1 *.flac 2>/dev/null | wc -l` if [ $count != 0 ] then echo true fi


#!/bin/bash files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l) if [ "$files" != "0" ] then echo "Some files exists." else echo "No files with that extension." fi


#/bin/bash myarray=(`find ./ -maxdepth 1 -name "*.py"`) if [ ${#myarray[@]} -gt 0 ]; then echo true else echo false fi


shopt -s nullglob set -- $(echo *.ext) if [ "${#}" -gt 0 ];then echo "got file" fi


shopt -s nullglob if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ] then echo true fi