Bagaimana saya bisa mencari file di semua sub-direktori menggunakan shell dan kemudian menyalin file-file itu?

8

Bagaimana saya dapat menemukan file * .mp3 saja dengan perintah rekursif seperti ls -R *.mp3pada direktori yang berisi beberapa sub-direktori dan pada akhirnya salin file-file ini dalam direktori yang saya pilih.

Terima kasih atas dukunganmu.

V 3 L 3 N 0
sumber

Jawaban:

14

Perintahnya adalah:

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

Alternatif:

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

Contoh:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

Untuk informasi lebih lanjut:

man find
hytromo
sumber
Para hakim juga akan menerima:find /path/to/dir/ -name '*.c' | xargs cp -t /target/
Oli
Saya salah satu juri dan saya menolak solusi ini 8-) Terima kasih atas komentarnya, saya akan menambahkannya :)
hytromo
1
xargsbiasanya jauh lebih cepat. Saya baru saja menjalankan tes cepat di sini menemukan banyak file c dan menjalankannya ls -l. Ini 0m2.420s untuk xargsdan 0m25.494s untuk -exec... Jelas dalam hal ini cpoperasi akan mengambil sebagian besar waktu sehingga mungkin tidak masalah tetapi perlu dicatat.
Oli
Saya akan merekomendasikan menambahkan -n`` switch to the perintah cp` untuk menghindari menimpa dalam kasus duplikat nama (atau menulis skrip yang memeriksa duplikat sebelum menyalin dan mengganti nama target yang diperlukan)
Penatua Geek
2

Ada juga cara lain untuk melakukannya yang menurut saya akan sesuai dengan tujuan Anda dengan sempurna. Anda dapat menggabungkan finddengan satu whilelingkaran dan bahkan tidak perlu menggunakan salah satu execatau xargssama sekali. Jika, misalnya Anda ingin menyalin mp3sdari folder unduhan ke folder musik Anda, Anda akan menggunakan skrip berikut, yang telah saya gunakan berkali-kali.

Anda dapat memodifikasinya sesuai keinginan dengan mengubah direktori yang findmencari dan menempatkan file yang dihasilkan di dalamnya ; jika tidak ada direktori yang dinyatakan, findakan mencari seluruh folder home. Anda juga dapat mengubah cpke mvatau perintah lain. Ini cukup cepat, karena saya baru saja mengujinya dengan 3945 .jpgfile! Salin ke editor teks, simpan dan kemudian jalankan dengan menjalankan chmod +x myscript.

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f; 
do cp -- "$f" ~/Music ;
done

Pada wiki Bash yang dicatat ini ditunjukkan betapa bermanfaatnya menggabungkan whileloop dan readperintah untuk memproses output dari findperintah; dan cara saya melakukannya memastikan bahwa skrip tidak akan rusak jika ia menemukan nama file dengan spasi atau karakter tak terduga atau khusus lainnya.

Untuk informasi lebih umum tentang findperintah, masukkan di terminal man findatau lihat manual Ubuntu online . Untuk pengantar yang bagus untuk penggunaan find, lihat artikel ini juga.


sumber
tidak find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; donesederhana?
steabert
Metode saya mewakili praktik terbaik dan mencegah skrip agar tidak rusak, seperti yang tercantum di tautan yang saya kutip.
ah, begitu, menangani penanganan karakter khusus, terima kasih untuk tautannya :)
steabert
Saya akan merekomendasikan menambahkan -n`` switch to the perintah cp` untuk menghindari menimpa dalam kasus duplikat nama (atau menulis skrip yang memeriksa duplikat sebelum menyalin dan mengganti nama target yang diperlukan)
Penatua Geek