Saya mencoba memindahkan 8 file terakhir dari Documents
direktori ke direktori lain, tetapi saya tidak ingin memindahkannya satu per satu ke direktori tertentu. Apakah mungkin untuk memindahkannya dengan pengganti tail
perintah, tetapi untuk direktori, bukan file? Maksud saya, saya ingin melakukannya dengan sesuatu seperti tail -8 ./Documents | mv ./Anotherdirectory
atau dengan mv tail -8 ./Documents ./Anotherdirectory
.
Sebenarnya, saya sedang mencari cara cerdas untuk memindahkan 8 file terakhir (seperti yang tercantum dalam ls
) dengan cepat (tanpa mengetik setiap nama) ke direktori lain. Ada saran?
Jawaban yang Diterima:
Anda dapat menggunakan for
, yang mengulang file secara berurutan, dan memungkinkan kita untuk menghindari penguraian output find
atau ls
, untuk menghindari masalah dengan spasi dan karakter khusus lainnya dalam nama file. Terima kasih banyak kepada @muru karena telah meningkatkan ini
i=0; j=$(stat ~/Documents/* --printf "%in" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done
Uji terlebih dahulu dengan echo
, lalu hapus echo
untuk benar-benar memindahkan file.
Sebagai skrip:
#!/bin/bash
i=0
j=$(stat ~/Documents/* --printf "%in" | wc -l )
for k in ~/Documents/*; do
if (( (j - ++i) < 8 )); then
echo mv -v -- "$k" ~/AnotherDirectory
fi
done
lagi, hapus echo
setelah pengujian untuk memindahkan file secara nyata
Penjelasan
i=0
memberi tahu shell untuk memulai iterasi pada 0j=$(stat ~/Documents/* --printf "%in" | wc -l )
ini adalah pengaturan variabelj
ke bilangan bulat yang sama dengan jumlah total file dalam direktori. Terima kasih atas jawaban Serg atas pertanyaan saya sendiri tentang cara menghitung file dengan andal, apa pun karakter namanyado if (( (j - ++i) < 8 ))
untuk setiap iterasi loop, uji apakah hasilj
dikurangi berapa kali loop dijalankan kurang dari 8 dan jika yamv -v -- "$k" ~/AnotherDirectory
pindahkan file ke direktori baru