Saya memiliki direktori banyak file, seperti 50.000 pdf dan file lainnya di server. Saya perlu memindahkan yang spesifik ke direktori lain. Saya dapat membuat daftar file yang perlu dipindahkan baik dalam csv atau format teks lainnya.
Yang perlu saya lakukan adalah menjalankan skrip bash dan memindahkan atau menyalin file yang tercantum dalam file teks ke direktori lain.
Apakah ada cara mudah untuk melakukan ini? Setiap saran atau sumber daya akan sangat dihargai.
Jawaban:
rsync memiliki beberapa pilihan yang dapat mengambil daftar file untuk proses (
--files-from
,--include-from
, dll).Sebagai contoh, ini akan melakukan trik:
sumber
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
Untuk menghindari penggunaan yang tidak berguna
cat
(dan jika Anda tidak menggunakanrsync
):Ini akan menangani nama file yang valid, kecuali jika berisi baris baru, jika file terdaftar satu per baris.
sumber
mv
akan meruntuhkan semuanya ke direktori tujuan yang sama. Thersync
pendekatan dalam jawaban yang diterima tidak menderita dari keterbatasan ini.dengan asumsi bash, ditambah
listoffiles
mengandung satu file per baris. Satu-satunya keberatan saya terhadap rute rsync adalah bahwa OP meminta metode untuk memindahkan file, bukan menyalinnya. rsync memiliki lebih banyak bendera daripada pernikahan kerajaan, jadi saya yakin ini dapat dimodifikasi lebih lanjut untuk melakukan itu, tetapi terkadang lebih sederhana lebih baik!sumber
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
Ini tergantung pada format file teks yang Anda miliki. Misalnya, jika Anda memiliki daftar file yang ditulis sehingga Setiap file terletak pada baris baru. Anda dapat menggunakan xargs seperti:
Anda juga dapat menggunakan
find
perintah dengan-exec
opsi. untuk menyalin / memindahkan file.sumber
Rsync memiliki manfaat tambahan atas perintah
cp
ataumv
karena perintah itu akan secara otomatis membuat folder jika tidak ada.sumber
/path/to/source
diperlukan saat mengambil jalur dari daftar file?Saya pikir jawaban rsync adalah jawaban yang lebih baik, tetapi hanya untuk opsi lain:
sumber
Saya tidak sengaja menyalin isi lengkap direktori ke direktori tujuan alih-alih memindahkan direktori lengkap. Ini menghasilkan direktori tujuan yang berantakan bukannya direktori asal yang ditambahkan ke direktori.
Untuk memperbaiki ini, saya melakukan hal berikut:
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
Perintah di atas membuat file filestomove yang akan menjadi daftar semua konten direktori tujuan, dibalik diurutkan berdasarkan waktu, yang berarti terlama hingga terbaru.Lalu saya membuat sub-direktori dari direktori tujuan yang sekarang berantakan untuk memindahkan barang-barang ke.
mkdir /path/to/cluttered/destination/directory/newsubdirectory
Kemudian saya mengulang daftar direktori, kecuali daftar ke layar dan menunjukkan lebih banyak detail.
ls -lrht /path/to/cluttered/destination/directory/
Baris ini daftar direktori, diurutkan berdasarkan tanggal naik (urutan mundur berdasarkan waktu) dan menunjukkan informasi lebih lanjut, termasuk cap tanggal / waktu dari setiap file di direktori tujuan yang sekarang berantakan. Saya merujuk ini, mulai dari atas untuk menunjukkan direktori dan file apa yang ingin saya simpan di mana mereka berada. Akan ada celah dalam cap tanggal / waktu file di mana semua file baru mulai yang seharusnya tidak ada.Kemudian saya mengedit file filestomove yang dibuat pada langkah pertama di atas (yang diurutkan berdasarkan tanggal) dan menghapus beberapa dari daftar yang ada sebelumnya yang ingin saya tinggal dari direktori asli.
vim /opt/dircheck/filestomove
Hapus dari atas, semua file yang tidak ingin Anda pindahkan.Kemudian saya menggunakan perintah yang tercantum sebelumnya dalam posting ini untuk memindahkan file dalam daftar saya ke direktori baru yang saya buat.
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
Ini memindahkan semua file dalam sepersekian detik. (Catatan: Anda mungkin tidak memerlukan sudo di awal, ini masalah izin file).
Sekarang direktori tujuan asli saya bagus dan bersih dan berisi direktori baru dengan semua file dan direktori yang berantakan itu.
sumber
Jika (dan hanya jika), Anda tidak memiliki karakter jahat dalam nama file (spasi, baris baru, yang akan membingungkan xargs tentang cara memecah hal-hal menjadi argumen individu), dan Anda menghasilkan daftar file yang dipisahkan oleh baris baru (satu file) per baris), Anda bisa melakukan sesuatu seperti.
(Secara umum, lihat man xargs , ini luar biasa)
Jika mv Anda tidak memiliki opsi -t, Anda juga bisa melakukan beberapa tipu muslihat
Catatan - tak satu pun dari ini akan berfungsi seperti yang diharapkan jika ada nama file dengan baris baru di dalamnya.
sumber
cp
,mv
dan sejenisnya tidak memiliki-t
opsi pada bsd , dan contoh kedua dengan subkulit tidak berfungsi untuk saya (/path/to/move
ditambahkan sebagai nama file terakhir)(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Coba sesuatu seperti:
sumber
while read line; do mv $line /images; done < list.txt
sebagai satu perintahBerikut ini berfungsi untuk saya di mana saya perlu menyalin semua file PNG dari jalur tertentu (dan semua subdirs) ke lokasi baru sambil mempertahankan struktur direktori:
Karena RSYNC menciptakan mirror dari struktur direktori terlebih dahulu, kemudian menyinkronkan file, Anda dapat berakhir dengan folder berlebih yang kosong. Saya menggunakan flag --prune-empty-dirs untuk menghapus direktori kosong ini.
Saya tidak memiliki afiliasi, tetapi berpikir benar untuk memberi kredit kepada sumber yang mengilhami solusi ini: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/
sumber