Kopieren von Dateien mit mehreren Erweiterungen

22

Ich möchte Dateien mit mehreren Erweiterungen in ein einziges Zielverzeichnis kopieren.

Zum Beispiel kann ich den folgenden Befehl verwenden, um alle TXT- Dateien im Arbeitsverzeichnis in ein Verzeichnis mit dem Namen zu kopieren destination:

cp -v *.txt destination/

Und ich kann Folgendes verwenden, um alle PNG- Verzeichnisse im Arbeitsverzeichnis zu kopieren destination:

cp -v *.png destination/

Es ist jedoch zeitaufwendig, diese als separate Befehle einzugeben (auch bei Verwendung des Befehlsverlaufs). Gibt es also eine Möglichkeit, cpDateien mit dem Muster *.txt oder dem Muster *.pngzu kopieren destination? Im Idealfall möchte ich in der Lage sein, mehr als zwei Muster anzugeben - beispielsweise die Anweisung cp, alle *.txt oder *.png oder *.jpg Dateien zu kopieren destination.

Ich bin mir sicher, dass dies alles mit einem Shell-Skript möglich ist - ich verwende bashzum Beispiel -, aber gibt es eine Möglichkeit, dies einfacher zu bewerkstelligen, nur von der Konsole aus? Könnte ich irgendwie Klammererweiterung verwenden, um es zu tun?

Ich weiß, dass es möglich ist, alle Dateien im Arbeitsverzeichnis zu kopieren, mit Ausnahme der Dateien, die mit bestimmten angegebenen Mustern übereinstimmen. Da mein Arbeitsverzeichnis jedoch weit mehr Dateierweiterungen enthält, die ich nicht kopieren möchte als die, die ich mache , wäre das ein Schmerz.

Hast du irgendwelche Gedanken dazu?

Andrew
quelle
10
cp -v *.txt *.png destination/?
Iruvar

Antworten:

55

Die Klammererweiterung erledigt die Arbeit. man bashund suche nach Brace Expansion.

cp *.{txt,jpg,png} destination/

BEARBEITEN:

In Übereinstimmung mit der Anforderung des OP fehlte dem obigen Befehl die ausführliche Option:

cp -v *.{txt,jpg,png} destination/
Timothy Martin
quelle
2
Kann ich das unter Windows machen?
Sergiol
Wenn ich es tue cp data/images/*.{jpg,jpeg,png,mp4} destination/und eine mp4Datei nicht existiert, erhalte ich eine No such file or directoryFehlermeldung, die das Skript bricht. Kann ich dafür sorgen, dass die mehreren Erweiterungen alle fehlenden Formate ordnungsgemäß verarbeiten?
BradGreens
1
@BradGreens Sie sollten wirklich eine neue Frage stellen, anstatt hier in den Kommentaren zu fragen. Möglicherweise hat Ihre Frage bereits eine Antwort. Durch das Posten einer neuen Frage erhalten Sie nicht nur eine Antwort, sondern können auch nach anderen Personen suchen, die die gleiche Hilfe benötigen.
Timothy Martin
0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

Das funktioniert!

Ofek Ortal
quelle