Ordina prima le cartelle, poi i file [El Capitan]

0

Sono consapevole che ci sono molti post su questo problema, ma molti sono solo soluzioni alternative per Finder. Tuttavia uso la console più spesso del Finder a causa della programmazione.

Sono anche a conoscenza di qualcosa di simile (dopo aver ricevuto coreutils):

alias ll='gls -la -h --group-directories-first'

Ma questo è solo un altro 'plugin' o utilità esterna, che fa bene il lavoro ma non risponde alla mia domanda.

Ho anche scoperto che Dropbox Web ordina anche i tuoi file in base allo User Agent. Se viene modificato dal menu Sviluppo in Safari a IE o Firefox / Chrome (Widows), ordina prima le cartelle.

Ho capito che OS X e Windows devono essere ribelli, quindi usano un ordinamento diverso ma francamente è un casino quando hai un sacco di file e tutti si confondono.

OS X ha un'impostazione di sistema per questo, quindi quando digito ls -la output vengono prima ordinate le cartelle, quindi i file e entrambi sono alfabeticamente in ordine crescente (dalla a alla z)? O il meccanismo di ordinamento è correlato all'implementazione del programma / dell'applicazione che sta visualizzando i file?

    
posta Horkyze 18.01.2016 - 22:50
fonte

1 risposta

1

Penso che la risposta semplice sia no, se la domanda è se il comando nativo ls possa essere configurato per elencare le directory prima che elenchi le non-directory. Uno dei commenti suggerisce una pipeline di shell, ma piuttosto che affrontare questo problema potrebbe essere più semplice scrivere uno script.

Il seguente codice python non intende assolutamente essere un sostituto completo del comando ls , ma complicarlo per gestire più di ciò che ls fornisce si ritiene fattibile (il modulo argparse di python sarebbe d'aiuto).

#!/usr/bin/python                                                                                                                                                                    

import os
import sys

for top in sys.argv[1:]:
    for (name, dirs, files) in os.walk(top):
        print("{}:".format(name))
        for dir in dirs:
            print("{}/".format(dir))
        for file in files:
            print(file)

Ciò che rende la separazione delle directory da non-directory facile in questo esempio è che os.walk di python lo fa per me, nel suo valore di ritorno. L'uso di os.walk impone implicitamente l'equivalente di ls -R , ma dovrebbe essere facile da correggere adattando il codice da os.walk , che è il codice python nativo costruito su os.listdir e os.path.isdir , piuttosto che invocando os.walk direttamente.

Rispetto alla questione delle funzionalità native rispetto a quelle esterne, python è nativo per le versioni recenti di MacOS . Dove fare lo scripting in questo modo rispetto alla funzionalità esterna è una questione di gusti.

Potrebbe esserci un'invocazione di find che si adatta ai tuoi criteri, simile alla pipeline ls in un commento, utilizzando l'opzione -type in più invocazioni di find , ma per me mi sembra goffo rispetto a codice python.

    
risposta data 25.01.2016 - 02:13
fonte

Leggi altre domande sui tag