Menyalin file dengan banyak ekstensi

22

Saya ingin menyalin file dengan banyak ekstensi ke direktori tujuan tunggal.

Sebagai contoh, saya dapat menggunakan perintah berikut untuk menyalin semua file .txt di direktori kerja ke direktori bernama destination:

cp -v *.txt destination/

Dan saya dapat menggunakan yang berikut ini untuk menyalin semua direktori .png di direktori kerja ke destination:

cp -v *.png destination/

Tetapi perlu waktu untuk mengetik ini sebagai perintah yang terpisah (bahkan dengan menggunakan sejarah perintah). Jadi, apakah ada cara yang saya dapat memberitahu cpuntuk menyalin file dengan baik pola *.txt atau pola *.pngke destination? Idealnya, saya ingin dapat menentukan lebih dari dua pola - seperti menginstruksikan cpuntuk menyalin semua *.txt atau *.png atau *.jpg file ke destination, misalnya.

Saya yakin bahwa semua ini dimungkinkan menggunakan skrip shell - Saya menggunakan bash, misalnya - tetapi apakah ada cara untuk melakukannya lebih sederhana, hanya dari konsol? Bisakah saya menggunakan ekspansi brace untuk melakukannya?

Saya tahu bahwa mungkin untuk menyalin semua file di direktori kerja kecuali yang cocok dengan pola tertentu , tetapi karena direktori kerja saya berisi ekstensi file yang jauh lebih banyak yang saya tidak ingin salin daripada yang saya lakukan , itu akan merepotkan.

Apakah Anda punya pemikiran tentang ini?

Andrew
sumber
10
cp -v *.txt *.png destination/?
iruvar

Jawaban:

56

Perluasan brace akan menyelesaikan pekerjaan. man bashdan cari Brace Expansion.

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

EDIT:

Sesuai dengan permintaan OP, perintah di atas tidak memiliki opsi verbose:

cp -v *.{txt,jpg,png} destination/
Timothy Martin
sumber
2
Bisakah saya melakukan ini di Windows?
sergiol
Jika saya lakukan cp data/images/*.{jpg,jpeg,png,mp4} destination/dan mp4file tidak ada, saya mendapatkan No such file or directorykesalahan yang merusak skrip. Bisakah saya membuat beberapa ekstensi dengan anggun menangani format yang hilang?
BradGreens
1
@BradGreens Anda harus benar-benar memposting pertanyaan baru daripada bertanya di sini di komentar. Pertanyaan Anda bahkan mungkin sudah memiliki jawaban. Memposting pertanyaan baru tidak hanya akan memberi Anda jawaban tetapi juga akan dapat dicari oleh orang lain yang membutuhkan bantuan yang sama.
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

Itu berhasil!

Ofek Ortal
sumber