Ich möchte alle Dateien in einem Verzeichnis mit Ausnahme einiger Dateien in einem bestimmten Unterverzeichnis kopieren. Ich habe festgestellt, dass cp
Befehl hatte nicht die --exclude
Option. Wie kann ich dies also erreichen?
Antworten
Zu viele Anzeigen?ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
Der erste Teil ls
alle Dateien, aber versteckte bestimmte Dateien mit dem Flag -I
. Die Ausgabe von ls
wird als Standardeingabe für den zweiten Teil verwendet. xargs
Befehl erstellen und ausführen cp -rf -t destdir
von der Standardeingabe. Das Flag -r
bedeutet, Verzeichnisse rekursiv zu kopieren, -f
bedeutet, dass Dateien zwangsweise kopiert werden, wodurch die Dateien im Verzeichnis destdir
, -t
geben Sie das Zielverzeichnis an, in das kopiert werden soll.
Ich verwende eine "do while"-Schleife, um die Ausgabe des Befehls find zu lesen. In diesem Beispiel schließe ich bestimmte Muster aus, da es nur eine begrenzte Anzahl von Mustertreffern gibt, die ich haben möchte, und nicht solche, die ich nicht haben möchte. Sie könnten die Logik umkehren mit einer -not
vor dem -iname
Flaggen:
find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done
Ich verwende die obige Funktion, um alle Musikdateien zu kopieren, die auf meinem Server neuer sind als die Dateien auf einem Western Digital TV Live Hub, den ich unter /media/wd
. Ich verwende den obigen Befehl, weil ich viele DVD-Dateien, mpegs usw. habe, die ich ausschließen möchte UND weil rsync aus irgendeinem Grund so aussieht, als würde es kopieren, aber nachdem ich mir das wd-Gerät angesehen habe, sind die Dateien nicht da, obwohl es keine Fehler beim rsync mit diesem Befehl gab:
rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/
10 Jahre zu spät. Dank an Linus Kleen.
Ich hasse rsync
! ;) Warum also nicht find
y cp
? Und mit dieser Antwort auch mkdir
um eine nicht existierende Ordnerstruktur zu erstellen.
cd /source_folder/ && find . -type d -not -path '*/not-from-here/*' -print -exec mkdir -p '/destination_folder/{}' \;
cd /source_folder/ && find . -type f -not -path '*/not-from-here/*' -print -exec cp -au '{}' '/destination_folder/{}' \;
Es sieht so aus cd
Ñist es notwendig, relative Pfade mit find
.
mkdir -p
erstellt alle Unterordner und beschwert sich nicht, wenn ein Ordner bereits existiert.
Housten, wir haben das nächste Problem. Was passiert, wenn jemand einen neuen Ordner mit einer neuen Datei in der Mitte erstellt? Genau: Es wird für diese neuen Dateien fehlschlagen. (Lösung: einfach neu starten! :)) Die Lösung, alles in einen Ordner zu packen find
Befehl scheint schwierig zu sein.
Für die Säuberung: https://unix.stackexchange.com/q/627218/239596
- See previous answers
- Weitere Antworten anzeigen
24 Stimmen
rsync?
11 Stimmen
tar -c | tar -x
?2 Stimmen
@mvds, ich stimme Ihnen zu, tar mit '--exclude' zu verwenden ist eine gute Idee.
4 Stimmen
Mögliches Duplikat von Ordner rekursiv kopieren, einige Ordner ausschließen