Bagaimana cara menghapus semua kecuali satu file di Unix? [duplikat]


Jawaban:


20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

Contoh:

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

Untuk menghapus semua file kecuali 'test2':

ls * | grep -v test2 | xargs rm -rf

Maka output 'ls' adalah:

test2

EDIT:

Terima kasih atas komentarnya. Jika direktori berisi beberapa file dengan spasi:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

Anda dapat menggunakan (dengan bash):

rm !("test 1"|"test 4")

Output 'ls':

test 1
test 4

Akan melakukan sangat mirip menggunakan find, tetapi milik Anda bekerja dan Anda lebih cepat. +1
Rory Alsop

2
ini gagal jika Anda memiliki file dengan spasi di namanya.
Mat

Untuk menangani nama file dengan spasi yang bisa digunakanls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer

8

Dengan asumsi Anda menggunakan bash shell (kasus paling umum), Anda dapat menggunakan simbol negasi globbing (ekspansi nama path):

rm -rf !(myfile.txt)

Ini menggunakan globbing yang diperluas, jadi Anda harus mengaktifkannya terlebih dahulu:

shopt -s extglob

1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .

1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt


0

Untuk rekursif rmAnda harus melakukan rekursi dengan finddan mengecualikan file yang ingin Anda simpan (atau grep, tetapi itu dapat membawa Anda ke masalah spasi putih). Untuk bola shell, shell modern memiliki pola bola yang dapat digunakan untuk mengecualikan file; ini dapat dikombinasikan dengan rekursi glob tingkat shell jika tersedia (mis. zshmemiliki rm **/*~foo/bar- perhatikan bahwa ini kemungkinan akan mengalami batas panjang argumen untuk pohon direktori besar).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.