È possibile visualizzare tutti i file nella directory corrente con un nome file che non inizia con una cifra pari seguita da una lettera alfabetica?


0

Sto tentando di rispondere a questo problema per una classe COSC che si concentra su Linux / Unix.

Sto usando Linux con shell bash. Sono nuovo di Linux a settembre.

Il mio istruttore ha questa domanda nei compiti di questa settimana e in base alle discussioni in classe, passa dall'essere incluso, a non farlo. Mi piacerebbe davvero inchiodarlo dopo tutto il tempo che ci ho dedicato.

Il comando che ho creato non prende in considerazione se un file ha un nome che inizia con una cifra pari seguito da un'altra cifra che utilizza i caratteri jolly. Questo è il punto critico in cui la domanda viene inclusa o esclusa dal compito e mi sono seduto per ore a cercare di risolvere questo problema.

È persino possibile?

Mi sono inventato:

echo [!02468][a-zA-Z]*

Ogni suggerimento è ben accolto e molto apprezzato.

Risposte:


2

Puoi anche fare quanto segue

shopt -s extglob
echo !([02468][a-zA-Z]*)
shopt -u extglob

Devi abilitare extglob con shopt -s extglob primo.
Successivamente puoi disabilitarlo di nuovo con shopt -u extglob.

L'opzione della shell extglob ti offre una corrispondenza dei pattern più potente nella riga di comando.


0

Non penso sia possibile con un semplice comando. Il seguente dovrebbe fare il trucco però:

for i in *; do
  case "$i" in
    [02468][a-zA-Z]*) ;; # do nothing
    *) echo "$i" ;;
  esac
done

In realtà l'ho appena capito! echo [02468] [0-9] * | xargs echo [! 02468] [a-zA-Z] * Grazie per la risposta. Mi hai fatto pensare in una direzione diversa!
Kelly La Morge

Questo non funziona affatto. Se non ci sono file corrispondenti [02468] [0-9] * verrà passato letteralmente a xargs e visualizzato nell'output. E file come 2.txt andrebbero persi. E file come 11.txt andrebbero persi.
Michael Suelmann


0

@ La soluzione di Rik usando extglob è probabilmente il modo migliore per bash. Se hai bisogno di una shell agnostica (supponendo che stai usando GNU find), prova questo:

find . -type f -not -name "[02468][a-zA-Z]*"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.