2010-10-04 20 views

Respuesta

58
#!/bin/bash 

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

Por qué no debe analizar el resultado de ls http://mywiki.wooledge.org/ParsingLs –

+3

Hola Thomas, qué tal si agregamos una mejor solución a la pregunta en lugar de solo un voto a la baja. – JeremyWeir

+3

También Thomas, su ejemplo de por qué no usarlo es usando 'ls -l', mi respuesta usa' ls -1' – JeremyWeir

2

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

+1

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

+1

@msw - gracias, ni siquiera pensé en ese tema. Intenté modificar mi respuesta para tenerla en cuenta. – dtlussier

+0

Debe citar la variable, es decir, use '" $ file "', ya que el nombre del archivo puede contener algunos caracteres incorrectos, como espacios o asteriscos. –

2
#!/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 
10
#/bin/bash 

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

Este es bueno porque en realidad puedes * hacer * algo con los archivos después de encontrarlos. – ephsmith

+0

+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

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

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 ". –

+0

$ # es 1 para un archivo singe y 0 para ningún archivo. – frayser

1

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) .

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

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 
+2

Para un silencio adicional, redirige 2> y 1 también. – Jasper

+1

La versión if: 'if ls * .flac>/dev/null 2> & 1; entonces ... fi; ' –

2

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.

0

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.

0

Puede utilizar -f para comprobar si los archivos de un tipo específico existen:

#!/bin/bash 

if [ -f *.flac ] ; then 
    echo true 
fi 
Cuestiones relacionadas