HP-UX ***** B.11.23 U ia64 **** licencia de usuario ilimitada
find . -type d -name *log* | xargs ls -la
me da los nombres de directorio (los que contienen logen el nombre del directorio) seguidos de todos los archivos dentro de ese directorio.
Los directorios /var/opt/SID/application_a/log/, /var/opt/SID/application_b/log/, /var/opt/SID/application_c/log/y así sucesivamente contienen archivos de registro.
Solo quiero que el comando enumere los dos últimos archivos de registro ls, que generalmente encuentro usando ls -latr | tail -2.
La salida tiene que ser algo como esto ...
/var/opt/SID/application_a/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
find . -type d -name *log* | xargs ls -la | tail -2No me da el resultado anterior. Lo que obtengo es una lista de los últimos dos archivos de
find . -type d -name *log* | xargs ls -lacomando.
Entonces, ¿puedo canalizar comandos después de un canalizado xargs? ¿De qué otra manera puedo consultar para obtener la lista de archivos resultante en el formato anterior?
find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"
me da una lista de diez nombres de directorio dentro del directorio actual que resulta ser /var/opt/SIDy que tampoco es lo que quiero.

*log*contrario, el shell lo expandirá.sh -cespera el nombre del comando (parámetro 0) como su segundo argumento, por lo que siempre debe hacerlofind . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail(observelstailal final, que servirá como$0para el shell creado). De lo contrario, el primero de sus resultados ocupará ese rol y no se utilizará.Respuestas:
Ya casi has llegado. En su último comando, puede usar
-Ipara hacer lolscorrectoEntonces, con
usted buscará
echoel directorio encontradofindy luego lo haráls | tailen él.fuente
xargs -n 1 sh -c 'echo $0'echo $0fue útil (y más comprensible)-print0,xargs -0y escapar{}entre comillas dobles dentro delshcomando:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"GNU Parallel facilita este tipo de tareas:
Si no desea realizar una instalación completa de GNU Parallel, puede realizar una instalación mínima: http://git.savannah.gnu.org/cgit/parallel.git/tree/README
fuente
Solo además de fredtantini y como aclaración general (ya que los documentos son un poco confusos):
El
xargs -I {}tomará las '{}' caracteres de la entrada estándar y reemplazarlos con lo que viene desde la tubería. Esto significa que en realidad podría reemplazar{}con cualquier combinación de caracteres (tal vez para adaptar mejor su sabor de programación preferido). Por ejemplo :xargs -I % sh -c "echo %". Si siempre usa elxargs -I {}puede reemplazarloxargs -iya que es la taquigrafía.Luego
sh -cle indicará a su bash / shell que lea el siguiente comando desde una cadena y no desde la entrada estándar. Entonces escribirsh -c "echo something"es equivalente aecho something.El
xargs -I {} sh -c "echo {}"leerá la entrada que creó con lash -cque estáecho {}. Como le dijo que reemplazara{}con los argumentos que obtuvo de la tubería, eso es lo que sucederá.Puede probar esto fácilmente incluso sin tuberías, simplemente escriba el comando anterior en un terminal. Lo que escriba a continuación se enviará a la terminal (Ctrl-D para salir).
En el
ls -la {}comando vuelve a ocurrir lo mismo. El{}se reemplaza con el contenido del comando pre-pipe.fuente