Quiero poder usar todos los argumentos (-S, -s, -f) y poder usarlos juntos. -S imprime los archivos en la carpeta y su tamaño... -s imprime los archivos si son >= el tamaño de archivo proporcionado por el argumento -f encuentra todos los archivos con la subcadena dada.
¿Cómo haría que estos trabajaran juntos? En este momento, mi código hace todo esto por separado.
while((c = getopt(argc, argv, "Ss:f:")) != -1){ switch(c){ case 'S': // No clue how to make them work together. printf("Case: S\n"); printf("option -%c with argument '%s'\n", c, argv[optind]); printDIR(cwd, case_S); break; case 's': printf("Case: s\n"); printf("option -%c with argument '%s'\n", c, optarg); printDIR(cwd, case_s); break; case 'f': printf("Case: f\n"); printf("option -%c with argument '%s'\n", c, optarg); printDIR(cwd, case_f); break; default: printf("..."); } }printDIR es una función de puntero, por eso tengo cwd (que es el directorio) y case_S, etc.
Quiero poder decir... './search -S -s 1024 -f tar'. Esto debería buscar recursivamente en el directorio actual e imprimir el tamaño del archivo si es >= 1024 y si el archivo tiene la subcadena 'tar'. Pero también quiero que funcione incluso si no proporciono todos los argumentos.
Esta es la primera vez que pruebo algo como esto, así que soy nuevo en tratar de crear comandos UNIX y usar getopt args.
Convertir partes de algunos de mis comentarios en una respuesta.
Debe procesar las opciones sin realizar ninguna acción. Solo cuando haya terminado de procesar las opciones, sin errores, piense en hacer algo como llamar a printDIR() . Probablemente necesitará más argumentos para la función, o usará variables globales.
Tendrías una bandera como:
int recursive = 0; que establecería en 1 si la búsqueda fuera recursiva. Y int minimum_size = 0; y modifíquelo con -s 1024 . Y const char *filter = ""; y luego modifíquelo con -s tar . Etc. A menudo, estas son variables globales, pero si puede evitarlas pasándolas a la función, es mejor.
Su función podría convertirse en:
int printDIR(const char *cwd, int recursive, int minimum, const char *filter); y lo llamaría con las variables locales configuradas apropiadamente. Tenga en cuenta que debe verificar la conversión de cadena a entero antes de llamar a printDIR() .
Si hay argumentos que no son de opción, los procesaría después del manejo de opciones con:
for (int i = optind; i < argc; i++) printDIR(argv[i], recursive, minimum_size, filter);