Saya perlu membersihkan folder secara berkala. Saya mendapatkan daftar file yang berisi teks, file mana yang diizinkan. Sekarang saya harus menghapus semua file yang tidak ada dalam file ini.
Contoh:
dont-delete.txt
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Folder saya do clean-up berisi ini sebagai contoh:
ls /home/me/myfolder2tocleanup/
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Jadi file ini harus dihapus:
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Saya mencari sesuatu untuk membuat perintah hapus dengan opsi untuk mengecualikan beberapa file yang disediakan oleh file.
command-line
bash
scripts
rm
stefan83
sumber
sumber
Jawaban:
The
rm
perintah komentar sehingga Anda dapat memeriksa dan memverifikasi bahwa itu bekerja sebagai diperlukan. Maka cukup beri komentar pada baris itu.The
check directory
bagian akan memastikan Anda tidak sengaja menjalankan script dari direktori yang salah dan mengkritik file yang salah.Anda dapat menghapus
echo deleting
garis untuk menjalankan secara diam-diam.sumber
ls
dan menangkap hasil yang tidak bergunagrep
jika yang ingin Anda ketahui adalah apakah ada kecocokan atau tidak. Saya juga menggunakan pola string tetap untuk menghindari masalah melarikan diri.while
loop kefor
loop Anda secara tidak sengaja mengubahiteration key
darii
kef
. dalam deklarasi, yang memecahkan kode. Aku telah memperbaikinya.f
. ;-P (... dan +1 untuk jawaban Anda yang saya lupa sebelumnya.)Skrip python ini dapat melakukan ini:
Bagian penting adalah menghapus tanda komentar pada
os.unlink()
fungsi.CATATAN : tambahkan skrip ini dan
dont-delete.txt
ke skrip Andadont-delete.txt
sehingga keduanya ada dalam daftar, dan simpan di direktori yang sama.sumber
set
alih - alih untuk O (1) alih-alih O (n) mencari di bagian kedua.Inilah satu kalimat:
ls
mencetak semua file di direktori saat ini (dalam urutan diurutkan)sort dont_delete
mencetak semua file yang tidak ingin kita hapus dalam urutan<()
Operator ternyata string menjadi objek file seperticomm
perintah membandingkan dua file pra-disortir dan print garis yang mereka berbeda-2 -3
flags menyebabkancomm
hanya mencetak baris yang terkandung dalam file pertama tetapi bukan yang kedua, yang akan menjadi daftar file yang aman untuk dihapustail +2
panggilan hanya untuk menghapus judul daricomm
output, yang berisi nama file inputxargs
yang akan mengubah aliran output menjadi daftar argumenrm
. The-p
pasukan pilihanxargs
untuk meminta konfirmasi sebelum mengeksekusi.sumber
FWIW sepertinya Anda bisa melakukan ini secara asli
zsh
, menggunakan(+cmd)
kualifikasi glob.Untuk mengilustrasikannya, mari kita mulai dengan beberapa file
dan file daftar putih
Pertama, baca daftar putih ke dalam array:
atau mungkin lebih baik
(setara dengan
mapfile
built-in bash - atau sinonimnyareadarray
). Sekarang kita dapat memeriksa apakah kunci (nama file) ada dalam array menggunakan${keepfiles[(I)filename]}
yang mengembalikan 0 jika tidak ditemukan kecocokan:Kita bisa menggunakan ini untuk membuat fungsi yang mengembalikan
true
jika tidak ada kecocokan untuk$REPLY
dalam array:Akhirnya, kami menggunakan fungsi ini sebagai kualifikasi dalam perintah kami:
atau, dalam kasus Anda
(Anda mungkin ingin menambahkan nama file daftar putih itu sendiri ke daftar putih.)
sumber
Dengan asumsi bahwa bash shell Anda telah
extglob
shopt
disetel untuk aktif, berikut ini adalah alternatif yang agak lebih konservatif:(... menyertai saran comm @ gardenhead yang sangat baik!)
sumber
Dengan asumsi tidak ada spasi putih (Spasi / Tab) di file Anda yang tercantum dalam file bernama
list
, maka Anda akan melakukan:Cukup tambahkan
-delete
ke perintah di atas untuk menghapus file yang tidak ada di file daftar . Jika menemukan Anda tidak memiliki-delete
pilihan yang dapat Anda gunakanrm
dengan-exec
sebagai berikut:Atau gunakan
-exec
dengan+
terminator sebagai gantinya.echo
hanya digunakan untuk pengeringan.sumber
Kecuali jika output
ls /home/me/myfolder2tocleanup/
melebihi batas argumen shell maksimumARG_MAX
yaitu sekitar 2MB untuk Ubuntu, saya akan menyarankan yang berikut ini.Implementasi perintah satu baris yang akan melakukan pekerjaan, adalah sebagai berikut:
dont-delete.txt
file ke direktori yang berisi file yang akan dihapus seperti:cd
ke direktori yang berisi file yang akan dihapus seperti:sumber
Saran saya adalah:
Perbarui 2018-08-07
Contoh:
Catatan setelah baris 3 Anda akan memiliki
dont-delete.txt
file dengan konten:(yang utama
./
adalah sangat penting )File-file
c
dand
akan dihapus.sumber