Ich möchte alle Dateien aus einem Verzeichnis kopieren, mit Ausnahme eines mit dem Namen Default.png. Es scheint, dass es eine Reihe von Möglichkeiten gibt, dies zu tun. Was scheint Ihnen am effektivsten zu sein?
Ich möchte alle Dateien aus einem Verzeichnis kopieren, mit Ausnahme eines mit dem Namen Default.png. Es scheint, dass es eine Reihe von Möglichkeiten gibt, dies zu tun. Was scheint Ihnen am effektivsten zu sein?
Antworten:
Einfach, wenn src/
nur Dateien enthalten:
find src/ ! -name Default.png -exec cp -t dest/ {} +
Wenn src/
Unterverzeichnisse vorhanden sind, werden diese weggelassen, es werden jedoch Dateien in diese kopiert:
find src/ -type f ! -name Default.png -exec cp -t dest/ {} +
Wenn src/
Unterverzeichnisse vorhanden sind, wird dies nicht wiederholt:
find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +
\;
führt den Befehl einmal pro Datei aus. +
führt den Befehl einmal aus und übergibt ihm alle Dateinamen auf einmal (vorbehaltlich der Beschränkung der Befehlszeilenlänge). +
ist im Allgemeinen etwas effizienter.
Sollte wie folgt sein:
cp -r !(Default.png) /dest
Wenn Sie in einen Ordner kopieren, der im aktuellen Ordner verschachtelt ist (im folgenden Fall als Beispiel bezeichnet), müssen Sie dieses Verzeichnis auch weglassen:
cp -r !(Default.png|example) /example
shopt -s extglob
funktionieren, wenn es deaktiviert wurde.
shopt -s extglob
wie von @BarryKelly beschrieben verwendet werden muss. Damit funktioniert es perfekt.
!()
... Schön! Für diejenigen, die - wie ich - der Meinung sind, dass es Zeit ist, Bash zu studieren / zu überprüfen , sind hier die relevanten Links zu dieser Frage / Antwort: shopt / extglob und das Muster .
rsync ist seit langem mein cp / scp ersatz:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-r
Sie nicht das Argument, wenn Sie Verzeichnisse synchronisieren
Ich würde einfach tun:
cp srcdir/* destdir/ ; rm destdir/Default.png
es sei denn, die Dateien sind groß. Ansonsten zB verwenden
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
Default.png
in den beiden Verzeichnissen vorhanden, wird das Ein-Verzeichnis destdir
durch das Ein- srcdir
Verzeichnis ersetzt und das kopierte Verzeichnis gelöscht Default.png
. Stattdessen möchte das OP das beibehalten, Default.png
was bereits vorhanden ist destdir
.
Dies funktioniert hervorragend, um alles außer Knotenmodulen zu kopieren :) Viel Spaß und dank der obigen Antworten habe ich es gerade hinzugefügt. Rsync ist meiner Meinung nach besser als CP, da Sie den Fortschrittsbalken sehen können, ohne danach zu fragen.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
Verwenden Sie den Erweiterungsparameter der Shell mit Regex
cp /<path>/[^not_to_copy_file]* .
Bis auf die Datei not_to_copy_file wird alles kopiert
- wenn damit etwas nicht stimmt. bitte angeben!
[...]
) enthält eine Reihe von übereinstimmenden Zeichen, während eine führende Zeichenfolge ^
eine Übereinstimmung des Komplements der aufgelisteten Zeichen bewirkt. Im folgenden Beispiel wird keine der Dateien aufgelistet: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*
Alle Dateinamen, die mit einem der folgenden Zeichen beginnen, werden ausgeschlossen : _cefilnopty
.