Pertanyaan Apa perbedaan antara ls [13] dan ls {1,3}?


Saya membuat tiga file di direktori saya menggunakan perintah touch inv{1..3}.txt. Sekarang saya menggunakan dua perintah dan hasilnya hampir sama. Kedua perintah itu ls inv[13].txt dan ls {1,3}.txt.

Jadi bagaimana keduanya berbeda? Bagaimana kurung siku berbeda dibandingkan dengan kawat gigi? Saya juga googling untuk "linux [..]", tetapi tidak dapat menemukan apa pun, sehingga saya bisa tahu seperti apa hal-hal ini disebut dalam terminologi linux?

Terima kasih


11
2017-09-03 00:48


asal


Nama untuk ini adalah "ekspansi nama file" atau "goyangan". - Byte Commander
Manakah dari ini adalah ekspansi nama file atau globbing? Apakah itu braket persegi ([..]) atau kantung bunga ({..})? - posixKing
Mengunjungi Ekspansi Brace untuk {} dan Perluasan Namafile> Pencocokan Pola untuk []. - Pandya


Jawaban:


  • {} disebut brace ekspansi. Ini memiliki dua bentuk: {x..y} dan {x,y}, ganti x dan y dengan nilai alfabet atau numerik apa pun.

    Dalam bentuk pertama, {x..y} akan diperluas ke semua nilai dari x untuk y, inklusif. Sebagai contoh, {2..5} akan diperluas menjadi 2, 3, 4, 5.

    Dalam bentuk eksplisit kedua, {x,y} akan diperluas menjadi hanya x, y. Sebagai contoh, {2,5} akan diperluas menjadi 2 dan 5.

    Jika tidak ada perluasan, pola akan diperlakukan secara harfiah mis. di {a..3}.

    Hal penting untuk dicatat adalah bahwa perluasan brace akan dilakukan (jika mungkin) terlepas dari kecocokan file apa pun, sementara dalam pembuatan / pencocokan file.

  • [] dikenal sebagai pola perluasan nama jalan (atau globbing). Tidak seperti brace ekspansi Anda hanya dapat menggunakannya saat mencocokkan nama file, itu akan diperlakukan secara harfiah jika Anda menggunakannya saat membuat file.

    Ini memiliki dua bentuk: [xyz...] dan [x-y].

    Dalam bentuk pertama, itu akan cocok dengan karakter tunggal di dalam tanda kurung siku secara terpisah I.e. setiap karakter diperlakukan secara individual. Jadi untuk [25].txt itu akan cocok dengan file bernama 2.txt atau 5.txt di direktori saat ini, sementara untuk [245].txt itu akan cocok dengan setiap file bernama 2.txt atau 4.txt atau 5.txt.

    Dalam bentuk kedua, perluasan rentang dilakukan terlebih dahulu sebelum dicocokkan secara individual, jika mungkin sebaliknya diperlakukan secara harfiah. Jadi untuk [2-5]. txt, itu akan cocok dengan setiap file bernama 2.txt atau 3.txt atau 4.txt atau 5.txt. Jika rentang tidak dapat diperluas, itu akan diperlakukan secara harfiah mis. dalam kasus [a-3].txt.


Perbedaan perilaku yang penting antara keduanya adalah ketika ada lebih banyak pola untuk dicocokkan sementara kurang benar-benar cocok. Sebagai perluasan brace dilakukan tidak peduli apa, itu akan menunjukkan kesalahan bahwa file tertentu (s) tidak ada sementara ekspansi pathname akan cocok dengan apa pun yang mungkin tanpa kesalahan untuk sisanya:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

Catatan Portabilitas:

Itu [] Operator ekspansi pathname didefinisikan oleh POSIX sehingga portabel di antara Bourne shell dan turunannya.

Ekspansi brace, {}, tidak didefinisikan oleh POSIX maka tidak portabel di antara semua shell. Sebagai contoh, dash (sh di Ubuntu) tidak memiliki ini. Itu dipinjam dari csh dan akan bekerja pada cangkang tertentu saja misalnya bash, zsh, ksh93, fish. Pastikan shell yang Anda gunakan mendukung ini sebelum menerapkan.


Contoh:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

14
2017-09-03 01:59



Orang harus menghindari bergantung pada perilaku [  ] ekspansi ketika tidak ada kecocokan karena itu bisa berbeda tergantung pada konfigurasi shell. Jika ingin digunakan [ atau ] dalam nama file, itu harus dikutip dalam perintah Anda. Perlu juga diperhatikan perbedaannya {13..79} dan [13-79]. Yang pertama akan menghasilkan semua angka dalam kisaran dari 13 untuk 79, yang kedua akan cocok dengan karakter 1, 3, 4, 5, 6, 7, dan 9. - kasperd
@kasperd Ya, begitulah nullglob (atau serupa) adalah untuk. Tentang [13-79] pencocokan, saya pikir saya sebutkan secara jelas dalam jawaban saya tentang perilaku per karakter [] `. - heemayl
@heemayl Saya pikir itu akan juga layak disebut bahwa bentuk `{1..3}` adalah bashism. Ini tidak akan berfungsi di dasbor. kupikir ksh memiliki fitur ini, tetapi tidak lebih modern, seperti mksh dan pkdsh - Sergiy Kolodyazhnyy
@Serg Menambahkan catatan portabilitas. - heemayl


Perbedaan utama antara dua bentuk diilustrasikan di sini:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txt adalah gumpalan dan akan memperluas daftar file yang cocok pada sistem file Anda. Ini adalah ekspansi pathname.

inv{1,5}.txt meluas ke inv1.txt dan inv5.txt terlepas dari file apa yang sebenarnya ada di sistem file Anda. Ini adalah brace ekspansi.


7
2017-09-03 01:09



Perbedaan utama lainnya adalah Anda dapat menulis ba{con,tman} dan tidak ada yang setara dengan tanda kurung siku. TKI, perluasan brace tidak hanya untuk karakter tunggal. - hobbs