Дело в том, как обрабатывается буферизация в этих программах.
Если вы хотите, чтобы grep выводил данные, переданные по трубопроводу, немедленно, используйте его с опцией --line-buffered.
ping -c 10 google.com | grep --line-buffered -o 'time\S*' | sed -e 's/time=//'
Если вы хотите, чтобы awk немедленно выводил данные по трубопроводу, вы можете использовать опцию -W interactive.
ping -c 10 google.com | awk -W interactive '{ print $7 }'
Для получения дополнительной информации вам следует прочитать man-страницы этих приложений.
Sí, esto es posible.
Una /bin/sh
solución:
#!/bin/sh
# number of entries to sync
k=2
# generate file list (sets $1, $2, $3 etc., collectively known as $@)
set -- src/*
# shift off all but the last $k of these entries
shift "$(( $# - k ))"
# create include patterns ($entry is not actually used,
# we work on the 1st element and then add it to the end and shift)
for entry do
set -- "$@" --include="${1##*/}/***"
shift
done
# run rsync
rsync --verbose --archive --delete --delete-excluded "$@" --exclude='*' src/ dest/
Esto crea una lista de archivos en $@
con set
primero (esta lista se ordena lexicográficamente, porque los globs hacen eso ), luego elimina todos menos el último $k
de estos. El bucle convierte cada src/element
en --include=element/***
. Este patrón de inclusión hará que rsync
considere el nombre element
y cualquier cosa debajo de él. Estos patrones de inclusión se utilizan en la línea de comando rsync
junto con --exclude='*'
, que excluirá todo lo que no esté incluido explícitamente (Asuntos de la primera coincidencia ).
La ejecución rsync
usa --delete
, que eliminará cualquier elemento de los subdirectorios incluidos en el destino que no esté disponible en el directorio de origen, y --delete-excluded
eliminará además todo lo que se excluyó.
Ejecute el script con sh -x
para ver qué sucede.
También podría hacer esto en bash
con arreglos, pero la sintaxis es un poco desordenada.