как лучше всего сопоставить версию номер из файла

Я знаю, что было указано find, но это похоже на работу для rsync.

Чаще всего я использую следующее:

rsync -axuv --delete-after --progress Source/ Target/

Вот хороший пример, если вы хотите переместить только файлы определенного типа (пример):

rsync -rv --include '*/' --include '*.js' --exclude '*' --prune-empty-dirs Source/ Target/

0
21.02.2018, 13:33
3 ответа

Suponiendo que el archivo generic_versioncontiene un número de versión por línea y que $versionpuede coincidir exactamente con una de estas líneas:

grep -xF "$version" generic_version

La ​​bandera -Fhace que grepinterprete el patrón como una cadena fija en lugar de como una expresión regular, mientras que -xobliga a la coincidencia a abarcar toda la línea (como si ^y $había sido utilizado en un patrón de expresión regular ).


Después de revelar el formato del archivo en la pregunta:

awk -v v="$version" '$1 == v' generic_version

Esto generará cada línea del archivo cuya primera columna separada por espacios en blanco sea idéntica al valor de la variable version.

1
28.01.2020, 02:18

Como mínimo, querrá hacer coincidir $versionsiempre que no esté precedido ni seguido por un dígito o punto para evitar coincidencias en cosas como 23.092.123 o 1.23.092.12 (aunque también puede querer para considerar también casos como 23.092.12-rc1, 23.092.12b, 23.092.12-2... ). Puede ser más fácil conperl:

<generic_version V=$version perl -ne 'print if m{(?<![\d.])\Q$ENV{V}\E(?![\d.])}'

Eso coincide con:

xxx 23.092.12 yyy
xxx23.092.12yyy
23.092.12-pre1

Pero no en

23.092.12.2
23.092.123
123.092.12
23.092.12.

Los operadores (?<!...)y (?!...)son, respectivamente, mirada negativa hacia atrás y hacia adelante. Usamos \Q...\Epara que el contenido de env var se tome como una cadena fija en lugar de una expresión regular (, por lo que .pierde su significado especial de coincidir con cualquier carácter ).

Si, según su edición, sus números de versión en el archivo de entrada siempre se encuentran al comienzo de la línea y siempre seguidos de un carácter de espaciado, puede simplificarlo a:

<generic_version V=$version perl -ne 'print if m{^\Q$ENV{V}\E\s}'

O use awkpara hacer coincidir las líneas cuyo primer campo es la versión:

<generic_version V=$version awk '$1 "" == ENVIRON["V"]'

La concatenación con ""es para forzar una comparación de cadenas. Sin él, con un $versioncomo 123.4,coincidiría con 123.40.

Para hacer coincidir el $versionsiendo cualquier campo delimitado por espacios en la entrada:

<generic_version V=$version perl -ne 'print if m{(?<!\S)^\Q$ENV{V}\E(?!\S)}'

Eso es $versionsiempre que no esté precedido ni seguido por un carácter sin -espaciado(\S).

2
28.01.2020, 02:18

Awksolución (según su formato de archivo de entrada):

version="23.092.12"
awk -v ver="$version" '$1 == ver' /tmp/generic_version

La salida:

23.092.12  # version approve 
1
28.01.2020, 02:18

Теги

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