Saya menyadari bahwa pertanyaan apa pun yang menanyakan cara menghapus file harus diambil dengan sangat hati-hati. Jawaban pertama saya terlalu tergesa-gesa saya tidak mengambil fakta bahwa filelist dapat cacat untuk digunakan dengan egrep. Saya mengedit jawaban untuk mengurangi risiko itu.
Itu harus bekerja untuk file yang tidak memiliki ruang dalam nama:
Pertama-tama buat ulang filelist Anda untuk memastikan agar sesuai dengan nama file yang tepat:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
membangun perintah rm
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Periksa apakah skrip rm cocok untuk Anda (Anda dapat melakukannya dengan "vim" atau "kurang").
Kemudian lakukan tindakan:
sh -x rmscript
Jika file memiliki spasi dalam namanya (jika file memiliki "
nama maka ini tidak akan berfungsi):
ls | egrep -vf newfilelist | sed 's,^\(.*\)$,rm "\1",' > rmscript
tentu saja daftar file tidak boleh berada di direktori yang sama!
Diedit:
Daftar file Nathan berisi nama-nama yang cocok dengan semua file dalam direktori (seperti "html" cocok dengan "bob.html"). Jadi tidak ada yang dihapus karena egrep -vf
menyerap semua aliran. Saya menambahkan perintah untuk meletakkan "^" dan "$" di sekitar setiap nama file. Saya beruntung di sini bahwa daftar file Nathan benar. Apakah itu telah diformat DOS dengan garis akhir CR-LF atau dengan ruang tambahan, tidak ada file yang akan disimpan oleh egrep dan semua telah dihapus.
ls
menyediakan nama file direktori,egrep -vf filelist
filter 50 nama file Anda. Saya khawatir Anda menghapus semua file Anda.Pra-bangun argumen untuk
find
:Gunakan
echo
bagian untuk melihat apa yang akan dibangun. Hapusecho
bagian untuk benar-benar menjalankannya.Pembaruan: Demonstrasi:
sumber
'
) harus ditambahkan yaitukeep=( -name \'"$REPLY"\' )
dankeep+=( -o -name \'"$REPLY"\' )
.Dengan
zsh
:Bunyinya baris
filelist
dalam array dan kemudian menggunakan glob qualifiers /e
string untuk glob / pilih hanya nama file yang tidak ada dalam array:.
memilih hanya file biasa (tambahkanD
jika daftar Anda berisi dotfile) dan negated^e_'expression'_
selanjutnya memilih hanya untuk dimana ekspresi mengembalikan false, yaitu jika nama mereka ($REPLY
) bukan merupakan elemen dari array .Jika Anda puas dengan hasil ganti
print -rl
denganrm
untuk benar-benar menghapus file:Untuk memilih & menghapus file secara rekursif, gunakan
*/**
glob dengan${REPLY:t}
pengubah glob:sumber
Jika Anda memasukkan konten direktori ke dalam file seperti ini:
Buka daftar file dengan editor teks, dan hapus semua file kecuali yang ingin ANDA HAPUS . Itu berani karena itu pendekatan yang berlawanan dengan jawaban di atas
Coba ini:
Jika Anda melihat daftar file yang di-output dengan layar ganti echo
rm -v
, seperti:sumber
Jalankan skrip di bawah ini.
all_files
.not_to_be_deleted_files
).not_to_be_deleted_files
danfiles_to_be_deleted
ke akhirnot_to_be_deleted_files
karena kami membutuhkan 2 file ini.join
perintah linux dan mengarahkan output kefiles_to_be_deleted
file.files_to_be_deleted
dan menghapus file yang disebutkan dalam nama file itu.Scriptnya seperti di bawah ini.
PS : Mungkin, jika Anda ingin ini disimpan sebagai skrip dan menjalankannya, Anda dapat menambahkan nama skrip juga menggunakan
echo scriptname >> not_to_be_deleted_files
.Meskipun tidak diperlukan, saya lebih suka melakukannya karena tidak akan ada penyesalan nanti. Saya menguji satu set kecil file dan itu berhasil di sistem saya. Namun, jika Anda ingin memastikan, coba di
test
direktori terlebih dahulu dan kemudian hapus file di direktori asli.sumber
sumber
Saya menggunakan pendekatan yang lebih aman dan lebih cepat karena saya memiliki 18.000 file dalam daftar! Saya perlu membersihkan gambar di instalasi Drupal besar.
Menghapus semua file yang tidak ada dalam daftar sama dengan hanya menyimpan file-file yang ada dalam daftar. Jadi saya memutuskan untuk benar-benar menyalin file dari daftar ke lokasi lain, tetapi menyalin 20 GB file akan memakan terlalu banyak ruang dan sangat lambat juga. Jadi triknya adalah menyalin file sebagai
hardlinks
gantinya, menggunakan-l
opsicp
. Ini hampir tidak memakan ruang dan sangat cepat. Selain itu, karena saya perlu mempertahankan struktur direktori, saya menggunakan--parents
opsi.Berikut ini kutipan dari daftar file saya:
Jadi contoh barisnya adalah, dengan temp menjadi tujuan:
Ini akan membuat struktur ini:
Perhatikan bahwa destinaton harus dalam sistem file yang sama dengan sumber agar hardlink berfungsi.
Langkah selanjutnya adalah membuat skrip:
Sekarang, anggap Anda sudah membuat dir kosong / some / where / temp, Anda dapat menyalin file seperti ini:
Perhatikan bagaimana kesalahan berakhir
missing_files
. Bonus tambahan dari pendekatan ini adalah Anda akan mendapatkan daftar file dari daftar asli yang sebenarnya tidak ada!Setelah menjalankan skrip, temp hanya akan berisi file-file yang ada di daftar file, tetapi tanpa menghapus apa pun dan tanpa mengambil ruang tambahan. Jika Anda puas dengan hasilnya, Anda dapat menghapus semua file asli termasuk subfolder.
Akhirnya, pindahkan file dan folder dari temp kembali ke lokasi asli.
Untuk 18.000 file hanya butuh beberapa detik.
sumber
Aman, sederhana.
cd
ke direktori.Buat direktori temp.
selesai
sumber