Saya memiliki file teks panjang dengan daftar file mask yang ingin saya hapus
Contoh:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
Saya perlu menghapusnya. Mencoba rm `cat 1.txt` dan dikatakan daftar itu terlalu panjang.
Menemukan perintah ini, tetapi ketika saya memeriksa folder dari daftar, beberapa dari mereka masih memiliki file.
xargs rm <1.txt
Panggilan rm manual menghapus file dari folder tersebut, jadi tidak ada masalah dengan izin.
Jawaban:
Ini tidak terlalu efisien, tetapi akan berfungsi jika Anda membutuhkan pola glob (seperti di / var / www / *)
Jika Anda tidak memiliki pola apa pun dan yakin jalur Anda dalam file tersebut tidak berisi spasi putih atau hal-hal aneh lainnya, Anda dapat menggunakan xargs seperti ini:
sumber
Dengan asumsi bahwa daftar file ada di dalam file
1.txt
, lakukan:The
-r
pilihan menyebabkan rekursi ke setiap direktori yang disebutkan dalam1.txt
.Jika ada file yang bersifat baca-saja, gunakan
-f
opsi untuk memaksa penghapusan:Berhati-hatilah dengan masukan ke alat apa pun yang melakukan penghapusan terprogram. Membuat tertentu bahwa file di dalam file masukan yang benar-benar akan dihapus. Berhati-hatilah dengan kesalahan ketik yang tampaknya sederhana. Misalnya, jika Anda memasukkan spasi antara file dan sufiksnya, itu akan tampak menjadi dua nama file yang terpisah:
sebenarnya adalah dua file terpisah:
file
dan.txt
.Ini mungkin tidak terlalu berbahaya, tetapi jika kesalahan ketiknya seperti ini:
Kemudian alih-alih menghapus semua file yang dimulai dengan
myoldfiles
, Anda akan berakhir dengan menghapusmyoldfiles
dan semua file non-dot dan direktori di direktori saat ini. Mungkin bukan yang Anda inginkan.sumber
Gunakan ini:
Jika Anda membutuhkan ekspansi global, Anda dapat menghilangkan kutipan
$file
:Tetapi berhati-hatilah bahwa nama file dapat berisi konten yang "bermasalah" dan saya akan menggunakan versi yang tidak dikutip. Bayangkan pola ini di file
Ini akan menghapus cukup banyak dari direktori saat ini! Saya akan mendorong Anda untuk menyiapkan daftar hapus dengan cara yang pola glob tidak diperlukan lagi, dan kemudian gunakan kutipan seperti pada contoh pertama saya.
sumber
/My Dir With Spaces/
/Spaces and globs/*.txt
,--file-with-leading-dashes
dan sebagai bonus itu POSIX dan bekerja pada GNU / Linux, MacOS dan BSD.Anda bisa menggunakan '\ n' untuk mendefinisikan karakter baris baru sebagai pembatas.
Hati-hati dengan -rf karena dapat menghapus apa yang tidak Anda inginkan jika 1.txt berisi path dengan spasi. Itu sebabnya pembatas baris baru sedikit lebih aman.
Pada sistem BSD, Anda dapat menggunakan opsi -0 untuk menggunakan karakter baris baru sebagai pembatas seperti ini:
sumber
xargs: illegal option -- d
-0
di OS X.xargs -I_ rm _
juga bekerja di OS X :) lihat stackoverflow.com/a/39335402/266309-d
), Anda dapat mengubah baris baru menjadi nulls terlebih dahulu:tr '\n' '\0' < 1.txt | xargs -0 rm
Anda dapat menggunakan satu baris ini:
Yang melakukan ekspansi shell tetapi mengeksekusi
rm
jumlah minimum kali.sumber
-n <n>
argumen kexargs
untuk mengurangi jumlah argumen yang diteruskan ke setiap rm, tetapi itu tetap tidak akan melindungi Anda dari satu glob yang melebihi batas.xargs -I{} sh -c 'rm {}' < 1.txt
harus melakukan apa yang kamu inginkan. Berhati-hatilah dengan perintah ini karena satu entri yang salah dalam file itu dapat menyebabkan banyak masalah.Jawaban ini diedit setelah @tdavies menunjukkan bahwa aslinya tidak melakukan ekspansi shell.
sumber
xargs -I{} sh -c 'rm {}' < 1.txt
Dalam kasus khusus ini, karena bahaya yang dikutip dalam jawaban lain, saya akan melakukannya
Edit di misalnya Vim dan
:%s/\s/\\\0/g
, keluar dari semua karakter spasi dengan garis miring terbalik.Lalu
:%s/^/rm -rf /
, prapenjualan perintah. Dengan-r
Anda tidak perlu khawatir memiliki direktori yang terdaftar setelah file yang ada di dalamnya, dan dengan-f
itu tidak akan mengeluh karena file yang hilang atau entri duplikat.Jalankan semua perintah:
$ source 1.txt
sumber
cat 1.txt | xargs rm -f | bash
Jalankan perintah ini akan melakukan hal berikut hanya untuk file.cat 1.txt | xargs rm -rf | bash
Jalankan perintah akan melakukan perilaku rekursif berikut.sumber
Sekadar memberikan cara lain, Anda juga bisa langsung menggunakan perintah berikut
sumber
Berikut contoh perulangan lainnya. Yang ini juga berisi 'if-statement' sebagai contoh pemeriksaan untuk melihat apakah entri adalah 'file' (atau 'directory' misalnya):
sumber
Di sini Anda dapat menggunakan sekumpulan folder dari deletelist.txt sambil menghindari beberapa pola juga
sumber
Ini akan memungkinkan nama file memiliki spasi (contoh yang dapat direproduksi).
sumber
Jika seseorang lebih suka
sed
dan menghapus tanpa perluasan karakter pengganti :Pengingat: gunakan nama path absolut dalam file atau pastikan Anda berada di direktori yang benar.
Dan untuk kelengkapannya sama dengan
awk
:Perluasan karakter pengganti akan berfungsi jika tanda kutip tunggal dihapus, tetapi ini berbahaya jika nama file berisi spasi. Ini perlu menambahkan tanda kutip di sekitar wildcard.
sumber