@mattdm Menggunakan lstidak akan berfungsi jika salah satu nama file berisi kosong.
helpermethodhod
2
Bagaimana Anda mendefinisikan kata ? Jika file pertama adalah Sunset on a beach.jpg, haruskah itu Sunsetseluruh nama file? Bagaimana dengan Sea, sex and sun.ogg? Sea, Sea,atau seluruh nama file?
Stéphane Chazelas
@mattdm ls | head -1memberi saya hal-hal acak seperti a.patch p.pyyang bukan kata pertama dan bahkan file dalam urutan abjad.
phuclv
Jawaban:
52
Anda dapat menyalurkannya melalui awk dan membuatnya menggemakan kata pertama
echo *| head -n1 | awk '{print $1;}'
atau Anda memotong string dan memilih kata pertama:
echo *| head -n1 | cut -d " "-f1
atau Anda pipa itu sed sedor dan menghapus semuanya kecuali kata pertama
echo *| head -n1 | sed -e 's/\s.*$//'
Menambahkan | head -n1untuk memuaskan nitpickers. Jika string Anda berisi baris baru | head -n1akan memilih baris pertama terlebih dahulu sebelum perintah penting pilih kata pertama dari string yang diteruskan ke sana.
Itu akan mengembalikan kata pertama dari setiap baris, bukan kata pertama.
Stéphane Chazelas
2
saya bertanya-tanya berapa banyak baris yang echo *dihasilkan
Bananguin
Itu tergantung berapa banyak file yang memiliki karakter baris baru dalam namanya atau tergantung pada lingkungan atau bagaimana bash dikompilasi atau apakah beberapa file dipanggil -eatau -ee... muncul dalam daftar, berapa kali \nmuncul dalam nama file. Jika ada file yang dipanggil -n, itu mungkin bahkan tidak mengembalikan baris sama sekali ...
Stéphane Chazelas
Yah, kita masih berbicara bash dan 1. biasanya bash tidak akan melewatkan string dengan baris baru sebagai satu string dengan baris baru 2. Sangat sulit dan tidak biasa (tidak mungkin?) Untuk memiliki baris baru dalam nama file 3. a \ n di nama file akan muncul sebagai \ n 4. 3 berlaku untuk nama file yang dimulai dengan - 5. bahkan ketika dipanggil dengan -n atau -e echo akan membuka stdout dan menutupnya ketika selesai maka tentu saja ia akan mengembalikan garis, dan pada setidaknya satu string, dalam hal ini 6. saya mengedit saran saya untuk setidaknya menangani masalah multiline
Bananguin
1
Semua 5 poin itu salah. Coba di dir kosong: touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l'( xpg_echodiaktifkan di mana pun bashdiperlukan untuk menjadi Unix sesuai). Dan dalam direktori kosong lain: touch ./-n; bash -c 'echo * | wc -l'. Baris adalah urutan karakter yang diakhiri oleh karakter baris baru. Jika echotidak menampilkan karakter baris baru, itu tidak menghasilkan garis apa pun. Perilaku utilitas teks suka cut, awkatau sedtidak ditentukan jika input memiliki karakter tambahan setelah karakter baris baru terakhir dan perilaku bervariasi di seluruh implementasi.
Stéphane Chazelas
18
Dengan asumsi shell posixy ( /bin/shatau /bin/bashdapat melakukan ini)
all=$(echo *)
first=${all%%*}
Konstruksinya ${all%% *}adalah contoh penghapusan substring . The %%berarti menghapus pertandingan terpanjang *(ruang diikuti oleh apa pun) dari ujung kanan dari variabel all. Anda dapat membaca lebih lanjut tentang manipulasi string di sini .
Solusi ini mengasumsikan bahwa pemisah adalah ruang. Jika Anda melakukan ini dengan nama file maka setiap spasi akan memecahnya.
Bagus Tapi saya suka versi sederhana dan lebih non-hacky dengan headdancut
Anwar
4
IMO, head, cut & sed kurang sederhana. Mengapa menelurkan alat lain ketika subtitusi parameter bawaan melakukan pekerjaan dengan efisien. Jawaban ini adalah yang paling efisien dan cara yang paling portabel untuk memilih kata pertama dari daftar kata-kata yang dipisahkan oleh ruang (yang semuanya diminta oleh OP).
Juan
7
Dengan asumsi bahwa Anda benar-benar menginginkan nama file pertama dan bukan kata pertama , inilah cara yang tidak pecah di spasi putih:
Ketahuilah bahwa ini akan memusnahkan argumen lain pada skrip Anda, kecuali dijalankan dalam lingkup bantu. Ini juga akan diperluas ke *jika tidak ada file di direktori.
ls
tidak akan berfungsi jika salah satu nama file berisi kosong.Sunset on a beach.jpg
, haruskah ituSunset
seluruh nama file? Bagaimana denganSea, sex and sun.ogg
?Sea
,Sea,
atau seluruh nama file?ls | head -1
memberi saya hal-hal acak sepertia.patch p.py
yang bukan kata pertama dan bahkan file dalam urutan abjad.Jawaban:
Anda dapat menyalurkannya melalui awk dan membuatnya menggemakan kata pertama
atau Anda memotong string dan memilih kata pertama:
atau Anda pipa itu sed sedor dan menghapus semuanya kecuali kata pertama
Menambahkan
| head -n1
untuk memuaskan nitpickers. Jika string Anda berisi baris baru| head -n1
akan memilih baris pertama terlebih dahulu sebelum perintah penting pilih kata pertama dari string yang diteruskan ke sana.sumber
echo *
dihasilkan-e
atau-ee
... muncul dalam daftar, berapa kali\n
muncul dalam nama file. Jika ada file yang dipanggil-n
, itu mungkin bahkan tidak mengembalikan baris sama sekali ...touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l'
(xpg_echo
diaktifkan di mana punbash
diperlukan untuk menjadi Unix sesuai). Dan dalam direktori kosong lain:touch ./-n; bash -c 'echo * | wc -l'
. Baris adalah urutan karakter yang diakhiri oleh karakter baris baru. Jikaecho
tidak menampilkan karakter baris baru, itu tidak menghasilkan garis apa pun. Perilaku utilitas teks sukacut
,awk
ataused
tidak ditentukan jika input memiliki karakter tambahan setelah karakter baris baru terakhir dan perilaku bervariasi di seluruh implementasi.Dengan asumsi shell posixy (
/bin/sh
atau/bin/bash
dapat melakukan ini)Konstruksinya
${all%% *}
adalah contoh penghapusan substring . The%%
berarti menghapus pertandingan terpanjang*
(ruang diikuti oleh apa pun) dari ujung kanan dari variabelall
. Anda dapat membaca lebih lanjut tentang manipulasi string di sini .Solusi ini mengasumsikan bahwa pemisah adalah ruang. Jika Anda melakukan ini dengan nama file maka setiap spasi akan memecahnya.
sumber
head
dancut
Dengan asumsi bahwa Anda benar-benar menginginkan nama file pertama dan bukan kata pertama , inilah cara yang tidak pecah di spasi putih:
sumber
files=($(echo *))
bash
dikompilasi atau lingkungan, mungkin pada karakter backslash.text=$(echo *); set -f; files=($text)
:, jika tidak, lebih banyak wildcard dapat diperluas.files=$(echo *); echo ${files%% *}
Anda dapat menggunakan parameter posisi
sumber
*
jika tidak ada file di direktori.shopt -s nullglob
akan menangani ituPeriksa salah satu alternatif berikut:
Kemudian Anda dapat mencetaknya melalui
echo $FILE
.Lihat juga:
grep
satu-satunya kata pertama dari keluaran?sumber
Ini bekerja:
Kredit untuk https://unix.stackexchange.com/a/57879/3920
sumber
Mendapatkan seluruh nama file pertama:
sumber