Bagaimana Anda bisa memindahkan (atau menyalin) semua file dari jenis tertentu ke direktori di Unix?

22

Saya belum terlalu terbiasa dengan semua triknya grep/find/awk/xargs.

Saya punya beberapa file yang cocok dengan pola tertentu, katakanlah *.xxx. File-file ini berada di tempat acak di seluruh direktori tertentu. Bagaimana saya bisa menemukan semua file seperti itu, dan memindahkannya ke folder di direktori home saya di Unix (yang mungkin belum ada)?

qodeninja
sumber
4
Anda harus berhati-hati ketika berbicara tentang "tipe file". Dalam lingkungan unixy, contoh ".xxx" bahkan bukan ekstensi dalam pengertian Windows. ".xxx" hanya merupakan akhiran dari nama file. "Tipe file" lebih dari satu kategori: file biasa, file perangkat, tautan simbolik, direktori, pipa bernama, soket Unix-family, mungkin beberapa lainnya.
Bruce Ediger
@BruceEdiger terima kasih kurasa aku benar-benar bermaksud "pola nama file"
qodeninja

Jawaban:

22
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
Kevin
sumber
1
Saya akan menggunakanmv -i -t ~/dst {} +
enzotib
17

Jika Anda ingin memindahkan semua file di dalam hierarki direktori ke direktori tujuan tunggal, dalam bash ≥4 (masukkan shopt -s globstarAnda ~/.bashrc) atau zsh:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

Dalam cangkang lain:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

Cara membaca findperintah ini :

  • .: melintasi direktori saat ini
  • -name '*.xxx': bertindak pada file yang namanya cocok dengan pola ini
  • -exec … \;: lakukan perintah ini pada setiap file, ganti {}dengan path ke file

Ada perintah yang lebih kompleks menggunakan finditu lebih cepat jika Anda memiliki banyak file karena tidak perlu meminta mvproses terpisah untuk setiap file:

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

The +di bagian akhir memberitahu finduntuk menjalankan perintah pada beberapa file sekaligus. Karena findhanya bisa meletakkan nama file di akhir baris perintah, dan mvperlu memiliki direktori tujuan yang terakhir, kami menggunakan shell perantara untuk mengatur ulang argumen ( "$0"adalah argumen pertama ke shell ~/new-directory,, dan "$@"argumen berikutnya datang dari findPerluasan {}).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Jika Anda ingin mereplikasi struktur direktori dari file sumber yang cocok ke direktori target yang baru, Anda dapat menggunakan opsi GNU cp's --parents :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +
Frielp
sumber
3

Anda dapat menggunakan find tanpa -exec‍juga:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest
Ken Zein
sumber
1
Namun perhatikan bahwa find -execitu jauh lebih aman; contoh di atas akan gagal pada nama file yang mengandung spasi, misalnya.
Dhag