Se necesita una instrucción para ejecutar una tarea solo si el número de archivos en el directorio es mayor que 1

1

Quiero escribir un script, pero quiero una declaración if para que se ejecute solo si el número de archivos en el directorio es mayor que 1. ¿Es esto posible?

jlacroix82
fuente
Que has intentado ¡Pegue su script actual en la pregunta para solicitar mejores respuestas!
Ozair Kafray el
El guión es demasiado grande para caber en este cuadro. Todavía no he probado nada, ya que no tengo idea de cómo hacerlo.
jlacroix82
1
@ jlacroix82: puede pegar el script en pastebin y poner el enlace aquí.
fmanco
Aquí está en Pastebin: pastebin.com/4SGFHzVG Tenga en cuenta que soy muy sensible sobre el script, no quiero cambiar nada más que la funcionalidad agregada que solicito. Puse comentarios donde quiero que compruebe si hay más de un archivo antes de hacerlo.
jlacroix82

Respuestas:

3

Algo como

[ "$(ls -b | wc -l)" -gt 1 ] && { ... your statements ... }
jpalecek
fuente
¿Hay alguna manera de hacerlo con una declaración if?
jlacroix82
Esa es una (oculta / abreviada) si ... luego declaración. En toda su longitud, se leeríaif [ "$(ls -b | wc -l)" -gt 1 ]; then ... your statements ...; fi
Izzy
Las declaraciones aún se ejecutan si hay más de 1 archivo en el directorio o no. ¿Debo aumentar -gt 1 a -gt 2?
jlacroix82
@ jlacroix82: No olvide que esto también contará directorios, no solo archivos. Entonces, si tiene dos directorios dentro del directorio actual, la prueba tendrá éxito incluso si no hay archivos.
fmanco
No hay subdirectorios en absoluto, a menos que esté contando ..
jlacroix82
0

Necesitaba usar esto:

shopt -s nullglob
files=($dir/*) # $dir was declared earlier if you look at my script
if (( "${#files[@]}" >= 2 ));
     <statements>
fi
shopt -u nullglob

La razón por la cual ninguna de las soluciones publicadas aquí funcionó es por lo siguiente. El script está ejecutando las declaraciones EN CONTRA de los directorios, en realidad no está haciendo CD en los directorios. Al decirle con qué carpeta estoy trabajando ($ dir) obtiene la pista y funciona como se esperaba.

jlacroix82
fuente
Entonces, el problema es básicamente lo que te dije en mi comentario. De todos modos, he editado mi respuesta para que pueda ver cómo usar un directorio específico, pero me alegra que haya encontrado una solución.
fmanco
0

Usaré algo como:

    dir=.
    nf=`find . -maxdepth 1 -type f | wc -l`

    if [ "$nf" -gt "1" ] ; then
            <do something here>
    fi

Este enfoque solo contará filesen el directorio señalado por diry descartará cualquier subdirectorio posible.

No olvides cambiar de diracuerdo a tus necesidades.

fmanco
fuente
Simplemente lo probé, y <hacer algo aquí> no se ejecutará, incluso si hay archivos en el directorio.
jlacroix82
La instrucción [prueba] puede ser incorrecta: utiliza cadenas (entre comillas), pero una comparación numérica (-gt). Intente reemplazar esa parte por [ $nf -gt 1 ](para una comparación numérica). Si quieres hacer eso con cadenas, debería serlo [ "$nf" != "0" -a "$nf" != "1" ]. Además, podría (para fines de prueba) generar el valor almacenado en $ nf antes de la línea que comienza con "if".
Izzy
@ Izzy: Eso está mal. La comparación funciona con cadenas.
fmanco
@ jlacroix82: Por favor. Asegúrese de que el directorio actual sea el que desea. No olvides findencontrar archivos en el directorio actual. Si quieres puedes cambiar find .a find <directory>. También puede poner el comando pwden su script para saber cuál es su directorio actual. El script fue probado y funciona.
fmanco
@criziot: puede funcionar (según lo ordenado alfanuméricamente, cualquier "número de cadena" mayor que 1 comienza con el dígito 1 o superior), pero a) no es un buen estilo yb) nunca se sabe acerca de las implementaciones si "string -gt string" se convierte en silencio La página del manual de testforma explícita establece: INTEGER1 -gt INTEGER2: INTEGER1 is greater than INTEGER2. Nada sobre cadenas con "-gt". Pero no discutamos, mientras funcione;)
Izzy