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?


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

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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.