Saya memiliki direktori yang berisi banyak file. Saya ingin menghapus semua file kecuali file.txt. Bagaimana saya melakukan ini?
Ada terlalu banyak file untuk dihapus yang tidak diinginkan secara individual dan namanya terlalu beragam untuk digunakan * untuk menghapus semuanya kecuali file yang satu ini.
Seseorang menyarankan untuk menggunakan
rm !(file.txt)
Tapi itu tidak berhasil. Ia mengembalikan:
Badly placed ()'s
OS saya adalah Scientific Linux 6.
Ada ide?
file-management
Kantura
sumber
sumber
Jawaban:
POSIXly:
akan menghapus semua file biasa (secara rekursif, termasuk yang tersembunyi) kecuali
file.txt
. Untuk menghapus direktori, ubah-type f
ke-type d
dan tambahkan-r
opsi kerm
.Di
bash
, untuk menggunakanrm -- !(file.txt)
, Anda harus mengaktifkan extglob :(atau menelepon
bash -O extglob
)Perhatikan bahwa
extglob
hanya bekerja dibash
dan keluarga shell Korn. Dan menggunakanrm -- !(file.txt)
dapat menyebabkanArgument list too long
kesalahan.Di
zsh
, Anda dapat menggunakan^
untuk meniadakan pola dengan extendedglob diaktifkan:atau menggunakan sintaksis yang sama dengan
ksh
danbash
dengan opsiksh_glob
danno_bare_glob_qual
diaktifkan.sumber
rm
sebagaiecho rm
gantinya, dan meminta orang untuk hanya mengambil gema ketika mereka benar-benar yakin itu akan melakukan apa yang mereka inginkan. Selain itu, +1 untuk jawaban menyeluruh-delete
sebagai gantinya-exec
, lebih pendek dan lebih mudah diingat-delete
tidak didefinisikan oleh POSIX.find
solusi Gnouc yang dapat Anda lakukan! \( -name one_file -o -name two_file \)
dan seterusnya.Lain mengambil arah yang berbeda (jika tidak ada spasi dalam nama file)
atau (berfungsi meskipun ada spasi dalam nama file)
dari
man grep
:sumber
ls | grep -v "a file with spaces.bin" | xargs rm
. Ini adalahgrep
sintaksis normal .grep
tapirm
.rm
akan mendapatkan daftar argumen yang dipisahkan oleh spasi. Cobatouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: Anda akan mendapatkanrm: c: No such file or directory
danrm: d: No such file or directory
-print0
difind
dan-0
dixargs
. Berikut ini solusinya, tetapi sedikit tidak nyaman.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
. Ngomong-ngomong, gnuparallel
menangani ini dengan baik (saya hampir selalu menggunakannya sebagai pengganti xargs:ls | grep -v 'a b' | parallel rm
-
.Pertahankan salinan, hapus semuanya, pulihkan salinan:
Dalam satu baris:
Tapi itu membutuhkan shell yang mendukung string di sini.
sumber
rm
dantar -x
.rm
dapat gagal sebanyak yang diinginkan.Anda semua terlalu memikirkan ini.
Selesai.
EDIT Sebenarnya, lebih mudah:
sumber
Di OS Scientific Linux 6 saya ini berfungsi:
Saya juga telah menginstal Debian 32bit pada Mesin Virtual. Di atas tidak berfungsi tetapi yang berikut ini tidak:
sumber
find
solusi yang saya berikan tidak berfungsi?file.txt
atau apa pun?shopt
bukantcsh
builtin.Gunakan
rm !("file.txt")
sebagai gantirm !(file.txt)
sumber
shopt -s extglob
. Bagaimanapun, mengutip nama file sederhana seperti itu tidak akan membuat perbedaan.Hanya untuk memberikan jawaban yang berbeda, Anda dapat menggunakan perilaku default
rm
yang tidak akan menghapus folder:sumber
Saya menemukan bahwa pendekatan ini sangat sederhana, berfungsi, dan tidak memerlukan ekstensi khusus (yang saya tahu!)
sumber