¿Qué le haría para saber si los archivos de una extensión específica están presentes en un directorio, con bash?Verifique si existe un cierto tipo/extensión de archivo en el directorio
Algo así como
if [ -e *.flac ]; then
echo true;
fi
¿Qué le haría para saber si los archivos de una extensión específica están presentes en un directorio, con bash?Verifique si existe un cierto tipo/extensión de archivo en el directorio
Algo así como
if [ -e *.flac ]; then
echo true;
fi
#!/bin/bash
count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo true
fi
Tienes que ser carful qué bandera se lanza en su estado de cuenta if
, y cómo se relaciona con el resultado que desea.
Si desea comprobar si hay archivos sólo regulares y no otros tipos de entradas del sistema de archivos entonces usted quiere cambiar su esqueleto de código para:
if [ -f file ]; then
echo true;
fi
El uso de la -f
restringe la if
a archivos regulares, mientras que -e
es más expansivo y coincidirá con todos los tipos de entradas del sistema de archivos. Por supuesto, hay otras opciones como -d
para directorios, etc. Ver http://tldp.org/LDP/abs/html/fto.html para un buen listado.
Según lo señalado por @msw, test
(es decir, [
) se bloqueará si intenta alimentarlo más de un argumento. Esto podría ocurrir en su caso si el glob para *.flac
devolvió más de un archivo. En ese caso, trate de envolver su prueba if
en un bucle como:
for file in ./*.pdf
do
if [ -f "${file}" ]; then
echo 'true';
break
fi
done
De esta manera usted break
en la primera instancia de la extensión de archivo que desea y puede seguir adelante con el resto de la secuencia de comandos. Sólo
excepto 'test' (también conocido como' [ ') se queja si el patrón se expande a más de un archivo: "operador binario espera "o" demasiados argumentos " – msw
@msw - gracias, ni siquiera pensé en ese tema. Intenté modificar mi respuesta para tenerla en cuenta. – dtlussier
Debe citar la variable, es decir, use '" $ file "', ya que el nombre del archivo puede contener algunos caracteres incorrectos, como espacios o asteriscos. –
#!/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
Este es bueno porque en realidad puedes * hacer * algo con los archivos después de encontrarlos. – ephsmith
+1 para ajustar el funcionamiento de la subcadena se encuentra entre paréntesis para hacer que myarray sea una variable de matriz. De lo contrario, si find devuelve ningún resultado '$ {# myarray [@]}' es igual a 1 – shaffooo
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
Esto es incorrecto. Primero, probablemente significó '-ge' en lugar de' -gt', porque de lo contrario su código no detectará el único archivo. En segundo lugar, si no hay archivos que coincidan con el patrón, cualquier shell conforme dejará intacta la cadena '* .ext', por lo que aún obtendrá un" resultado ". –
$ # es 1 para un archivo singe y 0 para ningún archivo. – frayser
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 los frenos para asegurar que se utilice un subnivel (no quieren darle una paliza a su configuración actual nullglob
) .
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
Este utiliza ls (1), si no existen archivos FLAC, informes de errores y la secuencia de comandos ls salidas; othewise el guión continúa y los archivos puede ser procesada
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
Para un silencio adicional, redirige 2> y 1 también. – Jasper
La versión if: 'if ls * .flac>/dev/null 2> & 1; entonces ... fi; ' –
La solución superior (if [ -e *.flac ];)
no funcionó para mí, dando: [: too many arguments
if ls *.flac >/dev/null 2>&1;
entonces todo funcionará bien.
Aquí hay una solución que no utiliza comandos externos (es decir, no ls
), sino una función de shell en su lugar. Probado en bash:
shopt -s nullglob
function have_any() {
[ $# -gt 0 ]
}
if have_any ./*.flac; then
echo true
fi
La función have_any
utiliza $#
para contar sus argumentos, y [ $# -gt 0 ]
a continuación, comprueba si existe al menos un argumento.El uso de ./*.flac
en lugar de solo *.flac
en la llamada a have_any
es para evitar problemas causados por archivos con nombres como --help
.
Puede utilizar -f para comprobar si los archivos de un tipo específico existen:
#!/bin/bash
if [ -f *.flac ] ; then
echo true
fi
Por qué no debe analizar el resultado de ls http://mywiki.wooledge.org/ParsingLs –
Hola Thomas, qué tal si agregamos una mejor solución a la pregunta en lugar de solo un voto a la baja. – JeremyWeir
También Thomas, su ejemplo de por qué no usarlo es usando 'ls -l', mi respuesta usa' ls -1' – JeremyWeir