2 votos

¿Por qué rm en zsh abortar?

Tengo una serie de archivos:

 > $ ls
FleurInputSchema.xsd inp.xml              out                  usage.json
fort.77              juDFT_times.json     out.xml
 

y me gustaría eliminar algunos de ellos, pero no todos los archivos están ahí cada vez. Así que hice un alias para

 rm broyd  broyd.7 cdn* *.dat *.npy stars wkf2  fleurinputschema.xsd judft_times juDFT_times.json  inf out  out.xml  usage.json struct.xsf juDFT_times FleurInputSchema.xsd mixing_history* 2> /dev/null
zsh: no matches found: cdn*
 

Esto funciona bien en Linux usando zsh también. En mac, ni siquiera inicia el comando rm, después de que no puede completar el cdn --wildward. ¿Cómo consigo zsh para ignorar los archivos que faltan?

3voto

Hakunka-Matata Puntos 1

Con el zsh, el (muy cuerdo) valor predeterminado es error en globs que no puede ser ampliado a los archivos existentes. En otras conchas, la costumbre predeterminado es dejar el pegote virgen (que puede o puede no ser la mejor cosa a hacer en función de la comando - y esto puede muy bien ser una muy malo). Sospecho que su configuración de Linux tiene este anularse en algún lugar para seguir el comportamiento de otros shells.

Si usted está usando zsh en ambos conchas, en mi humilde opinión, la mejor opción sería calificar globs que se expanda para nada el uso de la (N) calificador:

% echo .zshc*
zsh: no matches found: .zshc*
% echo .zshc*(N)

%

Por supuesto, usted puede cambiar este comportamiento a nivel mundial. Escoja cualquiera de los siguientes más se adapte a tus necesidades:

setopt nullglob # all globs can expand to nothing
setopt +o nomatch # leave globs as-is instead of reporting error

2voto

staffan Puntos 3299

Por defecto, en zsh, si un comodín patrón no coincide con nada, zsh señales de un error y no se ejecuta el comando. Tenga en cuenta que el error viene de zsh, no de rm.

Esta es generalmente una función muy útil, ya que en muchos casos, si usted utiliza un patrón de caracteres comodín, que tiene la intención para que coincida con algo. Sin embargo, en los guiones (y, más generalmente, en los procesos automatizados, tales como su alias), es común para procesar todos los archivos que coincidan con un determinado patrón, y si los archivos no coinciden, entonces usted simplemente no hacer nada. Usted puede utilizar el N glob calificador para que. Por ejemplo:

for x in *.dat(N); do
  rm -- $x
done

Si usted está escribiendo una función o script donde todo el comodín de los patrones de ajuste de este uso, usted puede encender y apagar null_glob opción. Este es esencialmente equivalente a poner (N) al final de cada patrón de caracteres comodín.

La mejor manera de hacer su alias de trabajo en zsh es convertirlo en una función y el conjunto de la null_glob opción localmente. La razón tiene que ser una función es que usted necesita para hacer algo más complejo de ejecutar un comando con algunos argumentos predefinidos: usted también necesite configurar una opción. Usted también debe pasar la -f opción rm y no ignorar los errores de ella. De esta manera podrás ver si algo falla, por ejemplo, porque usted no tiene permiso para eliminar los archivos. Verás que no hay salida en casos normales, si algunos de los archivos de suceder a quedar borrados o no.

clean_some_files () {
  setopt local_options null_glob
  rm -f broyd  broyd.7 cdn* *.dat *.npy stars wkf2  fleurinputschema.xsd judft_times juDFT_times.json  inf out  out.xml  usage.json struct.xsf juDFT_times FleurInputSchema.xsd mixing_history*
}

Cuando usted tiene múltiples patrones, también existe la csh_null_glob opción. La diferencia con null_glob es que si usted tiene una serie de patrones, zsh todavía señales de un error si ninguno de los patrones de partido. Por ejemplo cat *.txt *.md funciona siempre y cuando haya al menos un .md archivo o .txt archivo, y las señales de un error si no hay ninguno (en oposición a la null_glob comportamiento que iría cat sin argumentos). Yo recomiendo activar esta opción en su .zshrc:

setopt csh_null_glob

También hay un nomatch opción por defecto (excepto cuando zsh es emular sh o ksh). Si se desactiva, zsh dejará la no-coincidencia de patrones solas en lugar de generar un error. Esto es conveniente cuando usted está utilizando caracteres comodín en algo que no está destinado a ser un modelo de comodín, por ejemplo, una URL que contenga ?. Pero también es propenso a errores, por lo que recomiendo mantener nomatch en.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X