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)?


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 \;

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 {}).


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 {} +

3

Anda dapat menggunakan find tanpa -exec‍juga:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
Namun perhatikan bahwa find -execitu jauh lebih aman; contoh di atas akan gagal pada nama file yang mengandung spasi, misalnya.
Dhag
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.