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