Как запустить несколько команд sed для списка файлов, используя вывод find, передаваемый через xargs

Теперь (с мая 2012 г.) он находится в pkgsrc - lang / python32

0
05.06.2018, 21:32
3 ответа

Para obligar a xargsa ejecutar solo sedcon un solo archivo a la vez, use -n 1con xargs. También debe pasar los nombres de ruta de findusando -print0y obtener xargspara recibirlos con-0(si su findy xargsadmiten 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 bashdespué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 .svy prueba si cada nombre coincidente es un archivo normal (tenemos que probar por separado con ! -hpara 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 bashtiene 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.

5
28.01.2020, 02:31

Вот еще один метод, который мне помог:

find -name "*.fail" | xargs -L 1 sed -i -e 's/cse/ecs/g' -e 's/trex/dino/g'
1
28.01.2020, 02:31

это сработало для меняgrep -rl foo | xargs sed -i 's/foo/bar'

0
11.05.2021, 15:38

Теги

Похожие вопросы