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.

cwd
quelle

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.

Tim Kennedy
quelle
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 .

Gilles 'SO - hör auf böse zu sein'
quelle
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/
k.parnell
quelle
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.

Thiton
quelle
-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/
York Tsai
quelle
Davon ausgenommen sind InnoDB-Dateien - keine numerischen Verzeichnisse.
Anthony Geoghegan