Necesito que mi script haga algo en cada archivo en el directorio actual, excluyendo cualquier subdirectorio.
Por ejemplo, en la ruta actual, hay 5 archivos, pero 1 de ellos es una carpeta (un subdirectorio). Mi script debe activar un comando dado como argumento al ejecutar dicho script. Es decir, "bash script wc -w" debería dar el recuento de palabras de cada archivo en el directorio actual, pero no de ninguna de las carpetas, para que la salida nunca tenga ninguna de las líneas "/ sub / dir: Is a directory".
Mi guión actual:
#!/bin/bash
dir=`pwd`
for file in $dir/*
do
$* $file
done
Solo necesito excluir directorios para el bucle, pero no sé cómo.
if [ -f "$file" ]; then ...
. No un directorio devolvería no solo archivos normales sino también sockets y enlaces simbólicos.! -d
.Aquí hay una alternativa al uso de un bucle for si lo que necesita hacer es simple (y no implica establecer variables en el shell principal & c).
Se puede utilizar
find
con-exec
y utilizar-maxdepth 1
para evitar de manera recursiva en el subdirectorio.El
[ -n "$1" ]
está ahí para evitar la ejecución de todos los archivos en el directorio cuando la secuencia de comandos no se pasa ningún argumento.fuente
En zsh, puede usar calificadores globales para restringir las coincidencias con comodines por tipo de archivo. Por ejemplo, agregar
(.)
después del patrón lo restringe a los archivos normales.Para hacer frente a los nombres de archivo que comienzan con
-
o.
, usewc -c -- *(.N)
owc -c ./*(.N)
. Si desea incluir también enlaces simbólicos a archivos normales, hágalo*(-.)
.Los otros shells comunes no tienen esa característica, por lo que debe usar un mecanismo diferente para filtrar por archivo, como probar los tipos de archivos en un bucle o
find
.fuente
Bash para bucle excluyendo subdirectorios ('/') y enlaces (@):
fuente