अजीब फ़ाइल नाम सॉर्टिंग (बैश, एलएस, सॉर्ट)


2

सभी का दिन शुभ हो।

मैं अपने संगीत को mplayer को खिलाने की कोशिश कर रहा हूं, इस तरह:, mplayer *लेकिन गलत ट्रैक ऑर्डर प्राप्त करना।

यहाँ पर मुझे ls(साथ ही ) क्या मिलता है ls -1, ls -1 | sortसंख्याओं के क्रम पर ध्यान दें, 'II', 'II', 'III' संक्षेप में

Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: II.Largo e Spiccato.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: I. Adagio e spiccato.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: II.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: III.Larghetto.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: IV. Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: II.Largo.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: I.Adagio.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: II.Allegro assai.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: II.Largo.mp3

ऐसा लगता है, ट्रैक नंबर के बजाय ट्रैक नाम जैसी किसी चीज़ के द्वारा छँटाई की जाती है, मैं कैसे बताऊँगा कि फ़ाइलों को लेक्सोग्राफिक रूप से क्रमबद्ध करना है?

यहाँ कुछ और जानकारी है जो प्रासंगिक हो सकती है:

$ LC_ALL=C type ls
ls is aliased to `ls --color=auto'
$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
$ LC_ALL=C bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
$ LC_ALL=C ls --version
ls (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.

upd। मैंने दो पहले फ़ाइल नामों को फ़ाइलों में संग्रहीत किया है:

$ ls -1 | head -n1 > fname1; ls -1 | head -n2 | tail -n1 > fname2

meld( diffजीयूआई) के साथ इन दो फाइलों की जांच करने के बाद यह सुनिश्चित करने के लिए कि गैर-टूटने योग्य स्थान जैसे कोई वर्ण नहीं हैं जो छंटाई को गड़बड़ कर सकते हैं। इसलिए ... इस तरह के पात्र नहीं हैं, स्पष्ट रूप से दिखाई देने के अलावा कोई अंतर नहीं है। दूसरे और तीसरे फ़ाइल नामों के लिए समान।


छँटाई क्रम सही है। sortउपयोगिता रोमन अंकों को नहीं समझती है।
Spack

मैंने अनुमान लगाया, चरित्र। (डॉट) I से कम है, इसलिए «I.» «II» से कम होना चाहिए - क्या ऐसा नहीं है? और «II।» «III» से कम होना चाहिए।
gluk47

2
गैर-अल्फ़ान्यूमेरिक वर्णों को अनदेखा करने लगता है, इसलिए एलेग्रो और लार्गो / लार्गेटो के बीच "I" को छांटना। और यह कंसर्ट 2 के लिए सही है, जहां I / II / III को लेक्सिकोग्राफ़िक रूप से नामित किया गया है, और IA, IIA और IIIL के बाद IV प्रकार।
डैनियल बेक

1
छँटाई के लिए लागू स्थान बदलें। जैसे LANG=C sortअलग है LANG=de_DE sort। तुम भी अलग व्यवहार करने के लिए अपने प्राथमिक स्थान को पैच करने में सक्षम हो सकता है।
डैनियल बेक

1
डैनियल ने जो सुझाव दिया, उसके समान, आप देख सकते हैं कि आपको क्या आउटपुट मिलता है LC_COLLATE=C sort। यह उन्हें कोडपॉइंट क्रम में क्रमबद्ध करना चाहिए।
मोनो

जवाबों:


2

आप एक कमांड की अवधि के लिए अस्थायी रूप से अपना लोकेल सेट कर सकते हैं: मैंने आपकी फ़ाइलों की सूची नाम वाली फ़ाइल में डाल दी है files:

आपने क्या देखा:

$ LC_ALL='ru_RU.UTF-8' sort files
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: II.Largo e Spiccato.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: I. Adagio e spiccato.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: II.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: III.Larghetto.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: IV. Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: II.Largo.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: I.Adagio.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: II.Allegro assai.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: II.Largo.mp3

आप चाहते हैं के अनुसार क्रमबद्ध:

$ LC_ALL=C sort files
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: II.Largo e Spiccato.mp3
Antonio Vivaldi - Op.3 concerto No.1 D-dur RV 549: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: I. Adagio e spiccato.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: II.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: III.Larghetto.mp3
Antonio Vivaldi - Op.3 concerto No.2 g-moll RV 578: IV. Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: II.Largo.mp3
Antonio Vivaldi - Op.3 concerto No.3 G-dur RV 310: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: I.Adagio.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: II.Allegro assai.mp3
Antonio Vivaldi - Op.3 concerto No.4 e-moll RV 550: III.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: I.Allegro.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: II.Largo.mp3
Antonio Vivaldi - Op.3 concerto No.5 A-dur RV 519: III.Allegro.mp3

विशेष रूप से, आप LC_COLLATEचर को सेट करना चाहते हैंC


हाँ, मेरी अंतिम समाधान था: export LC_COLLATE=C; mplayer *
gluk47

2

जैसा कि आप पहले से ही अपने मुद्दे को हल कर चुके हैं (कम से कम 8 तक रोमन संख्या के लिए), यह एक सामान्य टिप्पणी है:

ls *फ़ाइल ऑर्डर की जाँच करने के लिए एक अच्छा विकल्प नहीं है क्योंकि यह आपके संगीत खिलाड़ी के पास जाता है mplayer *। ऐसा इसलिए है क्योंकि lsस्वयं फ़ाइलों को पुनर्व्यवस्थित कर सकता है - और यह इस बात की गारंटी नहीं है कि तंत्र उसी तरह है जो शेल द्वारा उपयोग किया जाता है। यह आपकी सेटिंग्स पर निर्भर करता है। echo *इसके बजाय का उपयोग करें - या एक prettier उत्पादन के लिए printf "%s\n" *

यह उदाहरण मेरे व्यक्तिगत उपनाम के साथ दिखाता है ls="ls -v":

$ touch 1 2 3 12
$ ls *
1  2  3  12
$ echo *
1 12 2 3
$ printf "%s\n" *
1
12
2
3

एक बेहतर समाधान संभव है zsh, लेकिन AFAIK के साथ नहीं bash:

Mikael Magnusson ने zsh मेलिंग लिस्ट में रोमन नंबरों से निपटने के लिए एक शानदार फंक्शन पोस्ट किया । फ़ंक्शन के विवरण में जाने के बिना ही यह है कि यह कैसे काम करता है:

$ touch I II III IV V VI VII VIII IX X L C D M
$ print *
C D I II III IV IX L M V VI VII VIII X
$ print *(no+romansort)
I II III IV V VI VII VIII IX X L C D M

अंतिम प्रिंट कमांड (no+romansort)में शेल को बताता है, कि आप संख्यात्मक ( n) को छांटना चाहते हैं और o+पहले फाइलनाम को पार्स करने के लिए एक कस्टम फ़ंक्शन ( ) का उपयोग करते हैं ।

यह निश्चित रूप से काम करता है, जब रोमेन नंबर फ़ाइल नाम का केवल एक हिस्सा होता है। लेकिन जागरूक रहें, कि आपको HIST_SUBST_PATTERNसेट होने के विकल्प की आवश्यकता है !


धन्यवाद, यह वास्तव में दिलचस्प है! एक दिन हो सकता है कि मैं zsh को गोद लूंगा :) // अभी तक उत्थान नहीं कर सका, मेरी यहां बहुत कम प्रतिष्ठा है।
gluk47

1

किसी कारण से, मैक ओएसएक्स (10.8.3) पर सॉर्ट करना सही क्रम में रोमन संख्याओं को सॉर्ट करता है।

फिर भी, सॉर्ट करने के लिए उन्हें खिलाने से पहले रोमन नंबरों को प्रतिस्थापित करने के बारे में क्या:

cat filename.txt | sed 's/IV/4/g' | sed s'/III/3/g' | sed 's/II/2/g' | sed 's/I/1/g' | sort

यह मेरे लिए काम किया (लेकिन फिर से मैंने OSX पर यह कोशिश की)।


मेरे लिए बहुत जटिल लगता है। मैं बस mplayer *इसके करीब प्रदर्शन करना चाहता हूं या अपना संगीत प्राप्त करना चाहता हूं। बेशक, मैं आसानी से smth जैसा लिख ​​सकता हूं play.sh, लेकिन मैं अनावश्यक जटिलता से बचना चाहूंगा ...
gluk47
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.