Saya memiliki banyak file dan folder di folder tertentu dan saya ingin menghapus semuanya; Namun, saya ingin menyimpan file X, Y, dan Z.
Apakah ada cara saya bisa melakukan sesuatu seperti: rm * | but NOT grep | X or Y or Z
Saya memiliki banyak file dan folder di folder tertentu dan saya ingin menghapus semuanya; Namun, saya ingin menyimpan file X, Y, dan Z.
Apakah ada cara saya bisa melakukan sesuatu seperti: rm * | but NOT grep | X or Y or Z
Jawaban:
Alih-alih menggunakan rm, mungkin lebih mudah digunakan find . Perintah seperti ini akan menghapus semuanya kecuali file yang bernama persis 'file'
find . \! -name 'file' -delete
Banyak versi harus dapat mendukung globbing dan pencocokan ekspresi reguler.
Anda juga bisa menyalurkan output find ke rm juga
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
serta file apa yang akan disimpan dengan menghapus -delete
dan \!
.
find
bersifat rekursif! jadi semua file subdirektori yang tidak cocok dengan ' pola ' juga akan dihapus
Menggunakan zsh, dengan setopt EXTENDED_GLOB
, menggunakan ~
operator ( kecuali )
rm -- *~(x|y|z)
atau ^
operator (negasi):
rm -- ^(x|y|z)
Tapi, Anda mungkin harus memindahkan file di tempat lain, lalu hapus semuanya. Ini jauh lebih aman dalam hal slip jari, seperti memukul masuk terlalu cepat.
Versi bash yang lebih baru memiliki extglob
opsi shell yang memberi Anda sintaks untuk melakukan apa yang Anda inginkan (periksa halaman manual Anda di bawah "Pathname Expansion" untuk melihat apakah versi yang diinstal memilikinya):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Untuk menguji, saya sarankan Anda ganti dulu rm
dengan echo
untuk melihat apakah daftar file yang akan dihapus adalah apa yang Anda harapkan.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Perhatian: Jalankan perintah dan jika file yang akan dihapus adalah yang benar, jalankan lagi dan hapus karakter hash "#".
Jika nama file lebih rumit dari itu, lakukan
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Sekali lagi, pertama lihat hasilnya kemudian hapus tanda hash.
Versi ini - seperti yang disarankan dalam komentar - menyimpan beberapa karakter dan terlihat sedikit lebih jelas.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
dan a b
program pertama akan menghapus - jika Anda memasukkan ab ke dalam bagian grep: "^[ab]$"
a
dan b
tetapi tidak a b
, lawan saja dari niat Anda. Perintah kedua akan melakukan hal yang sama. Dan yang ketiga juga. Anda seharusnya tidak menggunakan 'ls' dalam skrip, dengan pengecualian yang sangat, sangat jarang. Tapi jangan lakukan itu.
Pindahkan file yang ingin Anda simpan. Naik satu tingkat, hapus folder. Buat kembali folder dan pindahkan file-file itu kembali.
/
, heh? Tidak terlalu praktis. c) Mencoba menghapus semua file di komputer Anda $HOME
juga tidak terlalu praktis.
Ini yang saya atur sebagai skrip .sh untuk kait logout OSX / MacOS, berfungsi cukup baik.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
Dengan GNU-find Anda dapat menggunakan -delete switch, yang menghapus direktori, jika kosong juga:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
adalah salah satu cara untuk mengatasi ini.
tmp
juga jika tidak ada X
/ Y
/ Z
file di dalamnya. Catatan !
sebagai standar yang setara dengan GNU -not
( -delete
juga merupakan ekstensi GNU)