Wie kann man numerische Verzeichnisse mit rsync ausschließen?


8

Ich weiß, dass rsync eine --excludeOption hat, die ich ziemlich häufig benutze. Aber wie kann ich festlegen, dass alle "numerischen" Verzeichnisse ausgeschlossen werden sollen?

In der Verzeichnisliste unten möchte ich nur, dass es kopiert csswird html, undinclude

.
..
123414
42344523
345343
2323
css
html
include

Normalerweise ist meine Syntax so etwas wie

rsync -avz /local/path/ user@server:/remote/path/ --exclude="cache"

Ich denke, es sollte ungefähr so ​​aussehen, --exclude="[0-9]*"aber ich denke nicht, dass das funktionieren wird.

Antworten:


6

Die Ausschlussoption von rsync unterstützt Regex nicht wirklich, sondern ist eher ein Shell-Globbing-Pattern-Matching.

Wenn diese Verzeichnisse ziemlich statisch sind, sollten Sie sie einfach in einer Datei auflisten und verwenden --exclude-from=/full/path/to/file/exclude_directories.txt.

Aktualisiert, um ein Beispiel bereitzustellen

Zuerst fügen Sie einfach die Verzeichnisse in eine Datei ein:

find . -type d -regex '.*/[0-9]*$' -print > /tmp/rsync-dir-exlcusions.txt

oder

( cat <<EOT
123414
42344523
345343
2323
EOT ) > /tmp/rsync-directory-exclusions.txt

dann können Sie Ihre rsync-Arbeit erledigen:

rsync -avHp --exclude-from=/tmp/rsync-directory-exclusions.txt /path/to/source/ /path/to/dest/

Sie brauchen nur einen zusätzlichen Schritt, um die Textdatei einzurichten, die die auszuschließenden Verzeichnisse enthält, 1 pro Zeile.

Beachten Sie, dass der Pfad der Verzeichnisse im Job ihr relativer Pfad dazu ist, wie rsync das Verzeichnis sieht.


2
Sie könnten ein Skript verwenden, das einen regulären Ausdruck verwendet, um diese Datei zu erstellen, bevor Sie den rsync
Rory Alsop

Könnten Sie ein Beispiel als Antwort geben?
CWD

gerade aktualisiert, um ein Beispiel aufzunehmen, einschließlich dessen, was @RoryAlsop vorgeschlagen hat, kombiniert mit dem, was thiton unten vorgeschlagen hat.
Tim Kennedy

@TimKennedy Versteht rsync in der Datei mit Ausschlüssen Zeilenänderungen oder reicht der Speicherplatz aus?
Abhinav

@Abhinav rsyncversteht einen Eintrag pro Zeile. Leerzeichen funktionieren nicht.
Tim Kennedy

7

Sie können in der Mustersyntax von rsync nicht "einen Namen, der nur Ziffern enthält" sagen. Schließen Sie also alle Namen ein, die eine nichtstellige Zahl enthalten, und schließen Sie den Rest aus.

rsync --include='*[!0-9]*' --exclude='*/' …

Siehe auch meine rsync-Musteranleitung .


2

Sie können es in einer Zeile tun:

rsync -avHp --exclude-from=<(cd /path/to/source; find . -type d -regex './[0-9]*' | sed -e 's|./||') /path/to/source/ /path/to/dest/

2
Haa die Kraft der Muschel :)
Ludovic Kuty

1

Verwenden Sie find, um eine Liste der auszuschließenden Verzeichnisse zu erstellen, und verwenden Sie dann die Option --exclude-from von rsync, wie Tim Kennedy sie beschrieben hat.


-1

Verwenden Sie diesen Befehl:

$> rsync -avlH --exclude=*.ibd --exclude-from=<(ls -p | grep -v / | \
   grep -E 'ibdata|ib_logfile')  /mnt/myfuse/ /u01/my3309/data/

Davon ausgenommen sind InnoDB-Dateien - keine numerischen Verzeichnisse.
Anthony Geoghegan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.