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 log
en 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 -2
No me da el resultado anterior. Lo que obtengo es una lista de los últimos dos archivos de
find . -type d -name *log* | xargs ls -la
comando.
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/SID
y que tampoco es lo que quiero.
*log*
contrario, el shell lo expandirá.sh -c
espera 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
(observelstail
al final, que servirá como$0
para 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
-I
para hacer lols
correctoEntonces, con
usted buscará
echo
el directorio encontradofind
y luego lo haráls | tail
en él.fuente
xargs -n 1 sh -c 'echo $0'
echo $0
fue útil (y más comprensible)-print0
,xargs -0
y escapar{}
entre comillas dobles dentro delsh
comando: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 -i
ya que es la taquigrafía.Luego
sh -c
le 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 -c
que 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