Найти с exec не работает должным образом [закрыто]

ls -la | grep '^d' для получения списка всех каталогов в вашем текущем рабочем каталоге

ls -la | grep '^[^d]' для получения списка всех "файлов" (не каталога) в текущем рабочем каталоге

то, что показывает ls -la, начинается с d - это каталог. файлы начинаются с -

enter image description here

0
15.05.2018, 18:46
3 ответа

Si desea ver si hay algún directorio que coincida con ese patrón de nombre, podría findimprimir 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 findejecute 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 findy mantenerla separada de la salida ficticia :, necesitará archivos temporales o trucos de redirección. Esto debería ejecutar somecmden cualquier directorio que coincida con find, dirigiendo la salida de las ejecuciones somecmda 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 porfindsiempre produce salida, no hay necesidad de la salida ficticia. Simplemente capture lo que findimprima y vea si estaba vacío.

1
28.01.2020, 02:16

El -execsolo 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 zshy 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 findde (compatible que ya debe estar usando ya que está usando la extensión -maxdepthGNU):

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
3
28.01.2020, 02:16

Es feo, pero en bash:

(shopt -s nullglob; if ! [ -z /path/to/destination/dir*/ ] 2>&-; then  echo ok; else echo not ok; fi)

Con nullglobhabilitado, /path/to/destination/dir*/se expandirá a:

  • nada si no se encontraron directorios coincidentes, en cuyo caso la prueba -ztiene éxito, por lo que la prueba negada falla;
  • o a la lista de todos los directorios coincidentes, en cuyo caso:

    • si solo hay un directorio, la prueba -zfalla
    • si hay varios directorios, el comando de prueba falla ya que -zespera 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 [[... ]].

1
28.01.2020, 02:16

Теги

Похожие вопросы