681 Stimmen

Wie verwendet man den Befehl 'cp', um ein bestimmtes Verzeichnis auszuschließen?

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?

24 Stimmen

11 Stimmen

tar -c | tar -x ?

2 Stimmen

@mvds, ich stimme Ihnen zu, tar mit '--exclude' zu verwenden ist eine gute Idee.

4voto

Shashwot Risal Punkte 21
cp -r `ls -A | grep -v "Excluded_File_or_folder"` ../$target_location -v

2voto

LouisXW Punkte 21
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.

1voto

user3610268 Punkte 19

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/

1voto

John Smith Punkte 27
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/

1voto

qräbnö Punkte 2169

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X