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
Sandro Munda
sumber
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
Lauren
sumber
1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .
Rayfleck
sumber
1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt
Jlliagre
sumber
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).

geekosaurus
sumber