Я знаю, что было указано find
, но это похоже на работу для rsync
.
Чаще всего я использую следующее:
rsync -axuv --delete-after --progress Source/ Target/
Вот хороший пример, если вы хотите переместить только файлы определенного типа (пример):
rsync -rv --include '*/' --include '*.js' --exclude '*' --prune-empty-dirs Source/ Target/
Suponiendo que el archivo generic_version
contiene un número de versión por línea y que $version
puede coincidir exactamente con una de estas líneas:
grep -xF "$version" generic_version
La bandera -F
hace que grep
interprete el patrón como una cadena fija en lugar de como una expresión regular, mientras que -x
obliga 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
.
Como mínimo, querrá hacer coincidir $version
siempre 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...\E
para 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 awk
para 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 $version
como 123.4
,coincidiría con 123.40
.
Para hacer coincidir el $version
siendo 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 $version
siempre que no esté precedido ni seguido por un carácter sin -espaciado(\S
).
Awk
solució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