Estoy tratando de ejecutar rsync para copiar algunos archivos de forma recursiva en una ruta basada en su patrón de nombre de archivo, sin distinción entre mayúsculas y minúsculas . Esto es lo que he hecho para ejecutar rsync:
$ rsync -avvz --include ='*/' --include='.*[Nn][Aa][Mm][E].*' --exclude='*' ./a/ ./b/
No se copia nada, la salida de depuración muestra:
[sender] hiding file 1Name.txt because of pattern *
[sender] hiding file 1.txt because of pattern *
[sender] hiding file 2.txt because of pattern *
[sender] hiding file Name1.txt because of pattern *
[sender] hiding directory test1 because of pattern *
[sender] hiding file NaMe.txt because of pattern *
He intentado usar: --include='*[Nn][Aa][Mm][E]*'
y otras combinaciones pero todavía no funciona.
¿Alguna idea sobre cómo usar regex para incluir algunos archivos?
--exclude='*'
?Respuestas:
rsync no habla regex. Puedes alistar find y grep, aunque se vuelve un poco arcano. Para encontrar los archivos de destino:
Pero todos tienen el prefijo "a /", lo cual tiene sentido, pero lo que queremos terminar es una lista de patrones de inclusión aceptables para rsync, y como el prefijo "a /" no funciona para rsync I ' Lo quitaré con corte:
Todavía hay un problema: seguiremos perdiendo archivos en subdirectorios, porque rsync no busca directorios en la lista de exclusión. Voy a usar awk para agregar los subdirectorios de cualquier archivo coincidente a la lista de patrones de inclusión:
Todo lo que queda es enviar la lista a rsync; podemos usar el argumento --include-from = - para proporcionar una lista de patrones para rsync en la entrada estándar. Entonces, en conjunto:
Tenga en cuenta que se hace referencia al directorio de origen 'a' a través de dos rutas diferentes: "a /" y "./a/". Esto es sutil pero importante. Para hacer las cosas más consistentes, haré un cambio final y siempre me referiré al directorio de origen como "./a/". Sin embargo, esto significa que el comando de corte tiene que cambiar ya que habrá un "./" adicional en la parte frontal de los resultados de find:
fuente
-t
es un cambio válido.sed "s#^$1/*##"
buuuut que se romperá en las rutas que contienen un #. Para solucionarlo, tenemos que citar el nombre del directorio entrante:prefix=$(echo "$1" | sed 's#/#\\/#g')
y luegosed "s/^$prefix\\/*//"
Las posibilidades de las citas bash son un poco pesadillas;)Sugeriría usar la opción de filtro de rsync. Para su ejemplo simplemente escriba:
la primera regla de filtro le dice a rsync qué patrones incluir. La segunda regla es necesaria para indicarle a rsync que inspeccione todos los directorios en su recorrido. Para evitar la inclusión de directorios vacíos, se excluyen explícitamente por
-m
opción. La última regla de filtro le dice a rsync que elimine todos los patrones restantes que todavía no coinciden hasta ahora.fuente
Si usa ZSH, puede usar la bandera (#i) para desactivar la distinción entre mayúsculas y minúsculas. Ejemplo:
ZSH también admite exclusiones, que se especifican al igual que la ruta normal pero tienen un ~ inicial
Puede encadenar exclusiones:
Finalmente, puede especificar qué tipo de archivo desea que se devuelva (directorio, archivo, etc.). Esto se hace con (/) para el directorio y (.) Para el archivo.
Basado en todo esto, haría ese comando como:
(No veo la necesidad de una exclusión con estos selectores)
fuente
La respuesta de @ sqweek anterior es increíble, aunque sospecho que tiene un error en su
awk
script para generar directorios principales, ya que me da, por ejemplo:Pude solucionarlo usando en su
gensub
lugar:Entonces, su solución completa, con el
awk
bit cambiado, sería:fuente
sub("/[^/]*$")
).Intenté con un script de C # ya que es el lenguaje con el que tengo más experiencia. Puedo crear la lista de archivos que quiero incluir, pero alguien rsync todavía me dice que haga una caminata. Crea las carpetas, pero ignora los archivos. Esto es lo que obtuve.
Primero el contenido del directorio:
Luego, la salida del script C #:
Y la salida de depuración:
fuente
[EDITAR] Esto solo funciona localmente. Para rutas remotas, primero se debe crear la estructura de directorios.
Más simple que la respuesta aceptada; Use --file-from, que incluye directorios principales automáticamente e imprime la ruta del archivo con% P
Entonces solo tienes que usar
find
yrsync
.fuente