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
~
. File ini adalah file cadangan yang saya buat beberapa editor teks.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 adalahls -1
(digit satu) dan pada banyak sistem-1
diperlukan untuk menghasilkan output satu kolom pada terminal , tetapi ketikals
disalurkan (seperti di sini kegrep
) atau diarahkan,-1
tidak diperlukan, itu sudah satu kolom .Jawaban:
Alasan ini tidak berhasil adalah karena tilde diperluas ke direktori home Anda, jadi
grep
jangan pernah melihat tilde literal. (Lihat misalnya manual Bash tentang Ekspansi Tilde .) Anda perlu mengutipnya untuk mencegah ekspansi, yaituTentu saja, ini masih akan menghapus garis output dengan tilde di mana saja, bahkan di tengah nama file atau di tempat lain dalam
ls
output (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 menggunakannyasumber
Implementasi GNU dari
ls
(ditemukan pada sebagian besar sistem Linux) memiliki opsi untuk itu:-B
Abaikan cadangan:sumber
Jika Anda menggunakan bash, pastikan
extglob
diaktifkan:Maka Anda dapat menggunakan:
-d
untuk tidak menampilkan konten direktori!(*~)
semua file kecuali yang diakhiri dengan~
Pada zsh, Anda dapat melakukan hal yang sama dengan
kshglob
opsi atau menggunakan gumpalan diperpanjang sendiri: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
):Tapi ide umumnya adalah menggunakan
ls --ignore-backups
.sumber
Ini akan membantu:
Alasan: ~ char digantikan oleh direktori home Anda sebelum perintah dieksekusi. Mencoba
dan
sumber
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
-C
karena saya ingin tampilan yang bagus di kolom diurutkan)(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)
sumber
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
test
file, 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.
sumber
Meskipun banyak jawaban yang benar (saya suka yang
@Foon
khususnya), saya perhatikan bahwa mendapatkan daftar namals -l
agak 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:
yang secara harfiah mengatakan
find
kepada:.
-maxdepth 1
Di sana, cari entitas, yang
-type f
-a
~
:! -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)
).-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
find
perintah 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.sumber