Saya telah membuat skrip berikut yang memindahkan file masa lalu seperti yang didefinisikan dari direktori sumber ke direktori tujuan. Ini bekerja dengan sempurna.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Script ini memindahkan file dengan sangat baik, juga memindahkan file dari subdirektori sumber, tetapi tidak membuat subdirektori ke direktori tujuan. Saya ingin mengimplementasikan fitur tambahan ini di dalamnya.
dengan contoh
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Ketika saya menjalankan skrip ini, ia juga memindahkan file hex di direktori maxi, tetapi saya membutuhkan hex yang sama yang harus dibuat ke direktori maxi dan memindahkan file-file di hex yang sama di sana.
sumber
for x do
, Anda ada yang hilang di;
sana :). Juga, saya tidak tahu apa yang ingin Anda capai$0
tetapi saya cukup yakin itu akan menjadish
:).for x; do
secara teknis tidak kompatibel dengan POSIX (periksa tata bahasa ), tetapi shell modern memungkinkan keduanyafor x do
danfor x; do
; beberapa cangkang Bourne tua tidak grokfor x; do
. Pada shell modern, dengansh -c '…' arg0 arg1 arg2 arg3
,arg0
menjadi$0
,arg1
menjadi$1
, dll. Jika Anda ingin$0
menjadish
, Anda perlu menulissh -c '…' sh arg1 arg2 arg3
. Sekali lagi, beberapa shell Bourne berperilaku berbeda, tetapi POSIX menentukan ini.pushd
sepertinya pilihan yang lebih baikcd
, karena kurang mengganggu ke lingkungan saat ini.Saya tahu
find
telah ditentukan, tetapi ini terdengar seperti pekerjaan untukrsync
.Saya paling sering menggunakan yang berikut:
Ini adalah contoh yang bagus jika Anda hanya ingin memindahkan file dari tipe file tertentu ( contoh ):
sumber
--remove-source-files
sangat membantu, yang secara efektif menyebabkan file dipindahkan daripada disalin. Ini adalah penggunaan rsync yang luar biasa.Anda bisa melakukannya menggunakan dua instance find (1)
Selalu ada cpio (1)
Periksa argumen untuk cpio. Yang saya berikan
sumber
Ini tidak seefisien itu, tetapi kodenya lebih mudah dibaca dan dimengerti, menurut saya, jika Anda hanya menyalin file dan kemudian menghapusnya.
Pemberitahuan: Kesalahan ditemukan oleh @MV untuk operasi otomatis:
sumber
Anda dapat melakukan ini dengan menambahkan jalur absolut dari file yang dikembalikan oleh
find
ke jalur tujuan Anda:sumber
$destination
berisi karakter khusus, karena mengalami ekspansi di shell bagian dalam. Mungkin maksud Andadestination='\'"$destination"\''
? Itu masih pecah'
. Juga, ini membuat file seperti/home/maxi/home/ketan/hex/foo
bukan/home/maxi/hex/foo
.Lebih baik (tercepat & tanpa menghabiskan ruang penyimpanan dengan melakukan penyalinan alih-alih memindahkan), juga tidak terpengaruh oleh nama-nama file jika mereka mengandung karakter khusus dalam namanya:
Atau lebih cepat, memindahkan banyak file dalam waktu bersamaan untuk multi-CPU, menggunakan perintah "paralel":
PS: Anda salah ketik, "soure" harus menjadi "sumber". Saya menyimpan nama variabel.
sumber
Ini kurang elegan tetapi mudah jika jumlah / ukuran file tidak terlalu besar
Zip file Anda bersama menjadi
zip
arsip, dan kemudian unzip di tujuan tanpa-j
opsi. Secara default, zip akan membuat struktur direktori relatif.sumber
Coba dengan cara ini:
sumber
Karena sepertinya tidak ada solusi yang sangat mudah untuk ini dan saya sangat membutuhkannya, saya membuat utilitas open source untuk linux ini (memerlukan python): https://github.com/benapetr/smv
Ada beberapa cara bagaimana Anda dapat menggunakannya untuk mencapai apa yang Anda butuhkan tetapi mungkin yang paling sederhana adalah seperti ini:
Anda juga dapat menjalankannya dalam mode kering sehingga tidak melakukan apa pun selain mencetak apa yang akan dilakukan
Atau kalau-kalau daftar file terlalu panjang untuk masuk ke dalam baris argumen dan Anda tidak keberatan mengeksekusi python untuk setiap file, maka
sumber