Kopiowanie plików z wieloma rozszerzeniami

22

Chciałbym skopiować pliki z wieloma rozszerzeniami do jednego katalogu docelowego.

Na przykład mogę użyć następującego polecenia, aby skopiować wszystkie pliki .txt z katalogu roboczego do katalogu o nazwie destination:

cp -v *.txt destination/

I mogę użyć następujących poleceń, aby skopiować wszystkie katalogi .png z katalogu roboczego do destination:

cp -v *.png destination/

Ale wpisywanie ich jako osobnych poleceń jest czasochłonne (nawet przy użyciu historii poleceń). Więc, czy jest jakiś sposób, że mogę powiedzieć cp, aby skopiować pliki z obu wzoru *.txt lub wzoru *.pngdo destination? Idealnie, chciałbym być w stanie określić więcej niż dwa wzory - jak instruowanie cp, aby skopiować wszystkie *.txt lub *.png czy *.jpg pliki destination, na przykład.

Jestem pewien, że wszystko to jest możliwe przy użyciu skryptu powłoki - używam bashna przykład - ale czy jest jakiś sposób, aby to zrobić w prostszy sposób, tylko z konsoli? Czy mogę w jakiś sposób użyć rozszerzenia nawiasów klamrowych, aby to zrobić?

Wiem, że możliwe jest skopiowanie wszystkich plików w katalogu roboczym oprócz tych pasujących do określonych określonych wzorców , ale ponieważ mój katalog roboczy zawiera znacznie więcej rozszerzeń plików, których nie chcę kopiować, niż te , które robię , byłoby to uciążliwe.

Czy masz jakieś przemyślenia na ten temat?

Andrzej
źródło
10
cp -v *.txt *.png destination/?
iruvar

Odpowiedzi:

56

Rozszerzenie klamry wykona zadanie. man bashi wyszukaj Brace Expansion.

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

EDYTOWAĆ:

Zgodnie z żądaniem PO w powyższym poleceniu brakowało opcji pełnej:

cp -v *.{txt,jpg,png} destination/
Timothy Martin
źródło
2
Czy mogę to zrobić w systemie Windows?
sergiol,
Jeśli tak, cp data/images/*.{jpg,jpeg,png,mp4} destination/a mp4plik nie istnieje, pojawia się No such file or directorybłąd, który psuje skrypt. Czy mogę sprawić, by wiele rozszerzeń z łatwością obsługiwało brakujące formaty?
BradGreens,
1
@BradGreens Naprawdę powinieneś opublikować nowe pytanie zamiast zadawać tutaj w komentarzach. Twoje pytanie może nawet mieć już odpowiedź. Opublikowanie nowego pytania nie tylko da ci odpowiedź, ale będzie możliwe do przeszukania przez innych, którzy potrzebują tej samej pomocy.
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

To działa!

Ofek Ortal
źródło