Теперь (с мая 2012 г.) он находится в pkgsrc - lang / python32
Para obligar a xargs
a ejecutar solo sed
con un solo archivo a la vez, use -n 1
con xargs
. También debe pasar los nombres de ruta de find
usando -print0
y obtener xargs
para recibirlos con-0
(si su find
y xargs
admiten estas opciones no estándar ), de modo que los nombres de ruta que contienen espacios, etc. se manejan correctamente. Probablemente también necesite especificar que está buscando archivos regulares (y no directorios, etc. )y definitivamente necesita citar ese shell glob (o puede expandirse a cualquier nombre de archivo coincidente en el directorio actual):
find. -type f -name '*.sv' -print0 | xargs -0 -n 1 sed -i -e '<command>' -e '<command>'
O simplemente usefind
:
find. -type f -name '*.sv' -exec sed -i -e '<command>' -e '<command>' {} ';'
Relacionado:
Una solución que no está usando find
,pero en su lugar usa el **
patrón global (coincide "recursivamente" en subdirectorios )disponibles en bash
después de hacershopt -s globstar
:
shopt -s globstar dotglob nullglob
for pathname in./**/*.sv; do
if [[ -f "$pathname" ]] && [[ ! -h "$pathname" ]]; then
sed -i -e '<command> -e '<command>' "$pathname"
fi
done
Este bucle recorre todos los archivos que tienen un sufijo de nombre de archivo .sv
y prueba si cada nombre coincidente es un archivo normal (tenemos que probar por separado con ! -h
para asegurarnos de que no es un enlace simbólico a un archivo normal archivo )antes de aplicar el comando sed
. Las opciones de shell permiten el uso de **
(globstar
), la coincidencia de nombres ocultos(dotglob
)y elimina los patrones por completo si no coincide(nullglob
).
O, con el shell zsh
, que tiene **
habilitado de forma predeterminada, y puede usar un "calificador global" para hacer la mayor parte del trabajo "extra" que bash
tiene que hacer explícitamente:
for pathname in./**/.sv(.DN); do
sed -i -e '<command> -e '<command>' "$pathname"
done
El calificador glob (.DN)
modifica el patrón glob anterior para que solo coincida con archivos normales, coincida con nombres ocultos y se expanda a nada si no hay ninguna coincidencia.
Вот еще один метод, который мне помог:
find -name "*.fail" | xargs -L 1 sed -i -e 's/cse/ecs/g' -e 's/trex/dino/g'