ls -la | grep '^d'
для получения списка всех каталогов в вашем текущем рабочем каталоге
ls -la | grep '^[^d]'
для получения списка всех "файлов" (не каталога) в текущем рабочем каталоге
то, что показывает ls -la
, начинается с d - это каталог. файлы начинаются с -
Si desea ver si hay algún directorio que coincida con ese patrón de nombre, podría find
imprimir una salida ficticia para ellos y ver si la salida estaba vacía. P.ej.:
if [[ "$(find -type d -name "dir*" -printf.)" ]] ; then
echo "some matching directory exists"
else
echo "no matching directory exists"
fi
También puede hacer que find
ejecute un comando para los archivos que encontró, simplemente agregando -exec bash -c '...' _ {} \;
después de -printf
. Si el comando no produce ningún resultado, debería estar bien.
Empeora un poco si necesita capturar la salida del comando iniciado por find
y mantenerla separada de la salida ficticia :, necesitará archivos temporales o trucos de redirección. Esto debería ejecutar somecmd
en cualquier directorio que coincida con find
, dirigiendo la salida de las ejecuciones somecmd
a la salida estándar de los scripts, y luego informarle si hubo alguna coincidencia.
exec 3>&1
any=$(find -type d -name "dir*" -printf. -exec bash -c 'somecmd "$1" >&3' _ {} \; )
if [[ "$any" ]] ; then
echo "matching directories were processed"
else
echo "no matching directory exists"
fi
exec 3>&-
Por supuesto, si el comando iniciado porfind
siempre produce salida, no hay necesidad de la salida ficticia. Simplemente capture lo que find
imprima y vea si estaba vacío.
El -exec
solo se realizará para archivos que cumplan con los criterios anteriores(-name 'dir*'
y -type d
), y una vez para cada archivo.
Aquí, probablemente querrá usar zsh
y hacer algo como:
dirs=(/path/to/destination/dir*(N/))
if (($#dirs)); then
echo Found these dirs:
printf ' - %s\n' $dirs
else
echo >&2 No dir found
fi
O con bash versión 4.4 o superior y GNU find
de (compatible que ya debe estar usando ya que está usando la extensión -maxdepth
GNU):
readarray -td '' dirs < <(
find /path/to/destination -maxdepth 1 -type d -name "dir*" -print0)
if ((${#dirs[@]})); then
echo Found these dirs:
printf ' - %s\n' "${dirs[@]}"
else
echo >&2 No dir found
fi
Es feo, pero en bash:
(shopt -s nullglob; if ! [ -z /path/to/destination/dir*/ ] 2>&-; then echo ok; else echo not ok; fi)
Con nullglob
habilitado, /path/to/destination/dir*/
se expandirá a:
-z
tiene éxito, por lo que la prueba negada falla; o a la lista de todos los directorios coincidentes, en cuyo caso:
-z
falla -z
espera solo un operando y así pasa la prueba negada.
Ejemplos:
$ if ! [ -z /a* ] 2>&-; then echo ok; else echo not ok; fi
not ok
$ if ! [ -z /b* ] 2>&-; then echo ok; else echo not ok; fi # multiple: /bin /boot
ok
$ if ! [ -z /h* ] 2>&-; then echo ok; else echo not ok; fi # single: /home
ok
Este es un caso en el que no se puede utilizar la prueba ampliada, ya que la acumulación no ocurre en [[... ]]
.