Hindari daftar file yang diakhiri dengan ~ (file cadangan)

20

Persyaratan saya adalah mendaftar semua file dalam direktori, kecuali file yang diakhiri dengan ~(file cadangan).

Saya mencoba menggunakan perintah:

ls -l | grep -v ~    

Saya mendapatkan hasil ini:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

Saya hanya ingin mendapatkan file-file ini:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
curious_one
sumber
Sepertinya Anda mencoba menghindari daftar file yang diakhiri dengan ~. File ini adalah file cadangan yang saya buat beberapa editor teks.
ctrl-alt-delor
Sistem operasi apa yang Anda gunakan: apakah itu Gnu / Linux (seperti Debian, Ubuntu, Redhat, Centos, Fedora, Suse, Mint, Arch, ...)?
ctrl-alt-delor
2
Perhatikan bahwa file yang ingin Anda abaikan tampaknya merupakan file cadangan Emacs. Agak mudah untuk mengubah perilaku Emacs sehingga menyimpan cadangan dalam direktori terpusat dan tidak di semua tempat; lihat emacs.stackexchange.com/questions/33/…
Kilian Foth
Saya minta maaf untuk menjadi jahat tapi saya tidak percaya Anda; ls -l(huruf ell) akan mencakup izin, nlink, pemilik, ukuran dan modtime untuk setiap file yang terdaftar. Apa yang akan menghasilkan output yang Anda tunjukkan adalah ls -1(digit satu) dan pada banyak sistem -1diperlukan untuk menghasilkan output satu kolom pada terminal , tetapi ketika lsdisalurkan (seperti di sini ke grep) atau diarahkan, -1tidak diperlukan, itu sudah satu kolom .
dave_thompson_085
@ dave_thompson_085 Saya telah memotong semua teks, dan hanya nama file di sini .. Karena saya merasa itu tidak relevan. Dan juga ini adalah sistem produksi (bukan sistem saya sendiri). Jadi saya tidak ingin mencantumkan nama pengguna, detail, dan membocorkannya.
curious_one

Jawaban:

49
ls -l | grep -v ~

Alasan ini tidak berhasil adalah karena tilde diperluas ke direktori home Anda, jadi grepjangan pernah melihat tilde literal. (Lihat misalnya manual Bash tentang Ekspansi Tilde .) Anda perlu mengutipnya untuk mencegah ekspansi, yaitu

ls -l | grep -v "~"

Tentu saja, ini masih akan menghapus garis output dengan tilde di mana saja, bahkan di tengah nama file atau di tempat lain dalam lsoutput (meskipun mungkin tidak akan muncul di nama pengguna, tanggal atau semacamnya). Jika Anda benar-benar hanya ingin mengabaikan file yang diakhiri dengan tilde, Anda dapat menggunakannya

ls -l | grep -v "~$"
ilkkachu
sumber
48

Implementasi GNU dari ls(ditemukan pada sebagian besar sistem Linux) memiliki opsi untuk itu: -BAbaikan cadangan:

ls --ignore-backups
hschou
sumber
24

Jika Anda menggunakan bash, pastikan extglobdiaktifkan:

shopt -s extglob

Maka Anda dapat menggunakan:

ls -d -- !(*~)
  • -d untuk tidak menampilkan konten direktori
  • !(*~) semua file kecuali yang diakhiri dengan ~

Pada zsh, Anda dapat melakukan hal yang sama dengan kshglobopsi atau menggunakan gumpalan diperpanjang sendiri:

setopt extended_glob
ls -d -- ^*~

Karena akhiran untuk dikecualikan hanya satu karakter, Anda juga bisa mencocokkan nama file di mana karakter terakhir bukan tilde (ini seharusnya juga berfungsi tanpa extglob):

ls -d -- *[^~]

Tapi ide umumnya adalah menggunakan ls --ignore-backups.

Ravexina
sumber
12

Ini akan membantu:

ls -l | grep -v '~'  

Alasan: ~ char digantikan oleh direktori home Anda sebelum perintah dieksekusi. Mencoba

echo ~

dan

echo '~'
Nico Mittenzwey
sumber
6

Seperti yang disebutkan dalam balasan lain alasan Anda kemungkinan mengalami masalah adalah karena Anda tidak mengutip atau melarikan diri dari tilde.

Untuk satu kasus penggunaan tertentu saya telah menggunakan ekspansi nama file shell untuk melakukan sesuatu yang serupa. Saya telah menggunakannya sejak sekitar 2003, yang berarti telah bekerja pada berbagai implementasi shell yang sangat luas pada berbagai jenis sistem. (di sini saya juga menggunakan -Ckarena saya ingin tampilan yang bagus di kolom diurutkan)

ls -C *[!~]

(batasan dengan menggunakan ekspansi nama file shell tentu saja adalah bahwa direktori dengan jumlah file (non-cadangan) yang sangat besar akan menyebabkan ekspansi melebihi ukuran daftar argumen yang tersedia, meskipun pada kebanyakan sistem modern batas ini cukup tinggi, seringkali 250KB atau lebih, terkadang lebih)

Greg A. Woods
sumber
1

ls | grep -v '~$'adalah solusi cepat. Ia menggunakan ls untuk mencantumkan semua file (tidak tersembunyi), kemudian menggunakan grep dengan -v(pencocokan terbalik, yaitu, pengecualian) untuk mengecualikan semua baris dengan tilde ( ~) di akhir ( $).

NAMUN, jika Anda memiliki file APA PUN dinamai seperti sesuatu1, sesuatu2, itu adalah indikator bau BESAR bahwa Anda memiliki alur kerja yang buruk, yang harus Anda perbaiki pada sumbernya, bukan dengan peretasan yang kikuk seperti memodifikasi cara kerja ls.

Jika Anda mendapati diri Anda memberi nama file dengan nomor versi, seperti test1 dan test2 atau testone dan testtwo, maka yang Anda inginkan adalah sistem kontrol versi git.

Ini terutama benar dalam kasus Anda, di mana Anda memiliki banyak versi dari beberapa file, dan versinya tampaknya perlu dikoordinasikan antara semua file.

Sistem kontrol versi memungkinkan Anda melapisi jendela waktu pada filesystem, sehingga Anda hanya melihat satu testfile, tetapi di bawah kap (melalui program kontrol versi) semua versi tersedia untuk mencari, mengambil, kembali ke, membandingkan dengan, dll. .

Setelah Anda mengatur ini, Anda tidak perlu lagi file cadangan dari editor Anda, karena kontrol versi memiliki sejarah file sejak Anda mulai menggunakannya, bahkan jika Anda telah membuat ribuan perubahan sejak itu. Anda bahkan dapat "bercabang" dengan timeline sejarah, mencoba ide baru, dan kembali ke masa lalu maju untuk mencoba ide yang berbeda, jika Anda perlu.

tolong hapus saya
sumber
1

Meskipun banyak jawaban yang benar (saya suka yang @Foonkhususnya), saya perhatikan bahwa mendapatkan daftar nama ls -lagak timpang karena berbagai alasan.

Alat yang tepat untuk menemukan file adalah, tidak mengejutkan find,.

Salah satu hasilnya adalah ia dapat menangani "logika pemilihan" dengan sendirinya, misalnya:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

yang secara harfiah mengatakan findkepada:

  1. Cari file di direktori saat ini: .
  2. Hanya mencari mereka di tingkat direktori itu — yaitu, jangan berulang: -maxdepth 1
  3. Di sana, cari entitas, yang

    • jenis file: -type f
    • dan: -a
    • yang namanya tidak berakhir di ~: ! -name *~ (di mana !menegasikan arahan berikut yang cocok dengan nama file, -name *~).

    (Untuk membuat seluruh kecocokan pada jenis dan nama muncul sebagai unit logis, itu dipasangkan dengan (dan )).

  4. Cetak nama setiap file yang ditemukan: -print.

Anda perlu melindungi beberapa karakter yang khusus untuk shell agar tidak diinterpretasikan oleh shell, dan itulah sebabnya tanda kurung dan bang !, adalah garis miring terbalik, dan pola nama *~, dikelilingi dengan tanda kutip tunggal.

The findperintah memiliki mini-bahasa yang sangat kuat melalui penggunaan pilihan. Sebagai contoh, ini mungkin diperintahkan untuk secara rekursif memproses seluruh pohon sistem file (atau pohon) tetapi mengabaikan direktori tertentu saat memindai. Dimungkinkan untuk mencocokkan beberapa atribut file — seperti waktu pembuatan atau modifikasi atau ukuran apa pun.

Kostix
sumber