
He estado usando el siguiente comando para enumerar los diez archivos más grandes, en cualquier profundidad, en el directorio actual:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
(Yo uso awk
en lugar de head
para prevenir unaerror de tubería rotacuando la lista es demasiado larga)
Funciona bien, pero evidentemente es difícil recordarlo y escribirlo cada vez. Intenté poner esto en .bash_aliases, pero no funciona (imprime 10 líneas vacías).
Si uso less
en lugar de awk
, el resultado se presenta correctamente, pero eso significa mostrar la lista completa de archivos de más de 10 MB (mi umbral inferior), ordenados por tamaño, en lugar de solo los superiores.
Entonces, ¿qué hace que awk
el estrangulamiento sea parte de un comando con alias aquí (suponiendo que ese sea realmente el problema) y qué puedo hacer para solucionarlo?
Respuesta1
Cuando se utiliza este comando como alias, $0
ya no está protegido por comillas simples, por lo que se convierte a su nombre de shell. Estos comandos lo demuestran:
$ alias F="echo '$0'"
$ F
bash
El nombre del shell (presumiblemente bash
) resulta ser un no configuradoawknombre de la variable, lo que lleva a las líneas vacías.
Una forma de protegerse $0
de la expansión del shell sería usar algo como:
alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"
Sin embargo, como esto $0
es inútil, puedes eliminarlo del awk
extracto.
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
Puede ir más allá y eliminar todo el bloque, ya que imprimir la línea seleccionada es awk
el comportamiento predeterminado de todos modos:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
Alternativamente, puedes seguir usando head
y descartar el mensaje de error:
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head