linux - länge - title tag wordpress




Wie benutze 'cp' um ein bestimmtes Verzeichnis auszuschließen? (12)

Ich möchte alle Dateien in einem Verzeichnis außer einigen Dateien in einem bestimmten Unterverzeichnis kopieren. Ich habe festgestellt, dass der 'cp' Befehl keine Option --exclude hatte. Also, wie kann ich das erreichen?


Der einfachste Weg, den ich gefunden habe, wo Sie alle Dateien ohne Dateien und Ordner kopieren können, indem Sie einfach ihre Namen in die Klammern setzen:

cp -r !(Filename1 | FoldernameX | Filename2) Dest/

Dies ist eine Modifikation von Linus Kleens Antwort. Seine Antwort funktionierte nicht für mich, weil es eine geben würde. vor dem Dateipfad hinzugefügt, den cp nicht mag (der Pfad würde wie source / .destination / file aussehen).

Dieser Befehl hat für mich funktioniert:

find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;

Der Befehl --parents behält die Verzeichnisstruktur bei.


Eine Möglichkeit wäre, find -0 mit -prune zu verwenden, um alle Dateien und Verzeichnisse zu finden, die Sie verschieben möchten, und dann xargs -0 zu verwenden, um jedes zu kopieren.


Eine weitere einfachere Option ist die Installation und Verwendung von rsync mit der Option --exclude-dir, die sowohl für lokale als auch für entfernte Dateien verwendet werden kann.


Es ist relativ zum Quellverzeichnis.
Dadurch wird ausgeschlossen, dass die Verzeichnisquelle source/.git kopiert wird.

rsync -r --exclude '.git' source target

Ich nehme an, Sie verwenden Bash oder Dash. Würde das funktionieren?

shopt -s extglob  # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination

Machen Sie ein ls aus, das die Dateien ausschließt, die Sie nicht möchten, und das als das erste Argument für cp verwenden


Nun, wenn der Ausschluss bestimmter Dateinamenmuster von jedem unix-ischen Datei-Dienstprogramm (wie cp, mv, rm, tar, rsync, scp, ...) durchgeführt werden müsste, würde eine immense Doppelarbeit entstehen. Stattdessen können solche Dinge als Teil von globbing , dh von deiner Shell, ausgeführt werden.

bash

Link zum Handbuch, Suche nach extglob .

Beispiel:

$ shopt -s extglob
$ echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
images/004.bmp images/2252.png

Also legst du einfach ein Muster hinein !() , Und es negiert die Übereinstimmung. Das Muster kann willkürlich komplex sein, beginnend mit der Aufzählung einzelner Pfade (wie Vanwaril in einer anderen Antwort zeigt) !(filename1|path2|etc3) , zu !(filename1|path2|etc3) Dingen mit Sternen und Zeichenklassen. Weitere Informationen finden Sie auf der Manpage.

zsh

Link zum Handbuch, Abschnitt "Dateinamenerstellung" .

Sie können setopt KSH_GLOB und bash-ähnliche Muster verwenden. Oder,

% setopt EXTENDED_GLOB
% echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png

Also stimmt x~y mit Muster x überein, schließt aber Muster y . Weitere Einzelheiten finden Sie in der Manpage.

Fisch neu!

Die fish hat eine viel schönere Antwort darauf:

🐟 cp (string match -v '*.excluded.names' -- srcdir/*) destdir

Bonus-Pro-Tipp

Geben Sie cp * , drücken Sie Strg X * und sehen Sie, was passiert. es ist nicht schädlich, das verspreche ich


Verschieben Sie es einfach temporär in ein verstecktes Verzeichnis (und benennen Sie es nach Bedarf um, falls gewünscht).

mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname

rsync

rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/

und versuche es zuerst mit der Option -n, um zu sehen, was kopiert wird


rsync ist schnell und einfach:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

Sie können --exclude mehrfach verwenden.

Sie können auch -n für den Trockenlauf hinzufügen, um zu sehen, was kopiert wird, bevor Sie den echten Vorgang ausführen. Wenn alles in Ordnung ist, entfernen Sie -n von der Befehlszeile.


cp -r `ls -A | grep -v "c"` $HOME/

cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir

Edit: vergessen, den Zielpfad ebenfalls auszuschließen (sonst würde es rekursiv kopieren).





cp