GNU/Linux >> Linux Esercitazione >  >> Linux

AWK e nomi di file con spazio al suo interno.

Il problema qui è l'analisi con ls . Considera di dare un'occhiata qui:Perché non dovresti analizzare l'output di ls.

Il motivo per cui non dovresti farlo è poiché UNIX consente quasi tutti i caratteri in un nome file, inclusi spazi bianchi, nuove righe, virgole, simboli pipe e praticamente qualsiasi altra cosa tu abbia mai provato a usare come delimitatore tranne NUL. Nella sua modalità predefinita, se l'output standard non è un terminale, ls separa i nomi dei file con le nuove righe. Questo va bene finché non hai un file con una nuova riga nel suo nome.


Oh mio Dio, è terribile.

Il tuo script usa bash; Ti suggerisco invece di fare questo:

#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done

Consulta la Guida a Bash per maggiori dettagli sull'espansione dei parametri.


Potresti provare questo.

awk '{print substr($0, index($0,$9))}'

Ad esempio, questo è l'output del comando ls:

-rw-r--r--. 1 root root 73834496 6 dic 10:55 File con spazi 2

Se usi un semplice awk come questo

# awk '{print $9}'

Restituisce solo

# File

Se utilizzato con il comando completo

# awk '{print substr($0, index($0,$9))}'

Ottengo l'intero output

File con spazi 2

Heresubstr(s, a, b) :restituisce b numero di caratteri dalla stringa s, a partire dalla posizione a. Il parametro b è facoltativo.

Ad esempio, se la corrispondenza è addr:192.168.1.133 e utilizzi substr come segue

# awk '{print substr($2,6)}'

Ottieni l'IP, ad esempio 192.168.1.133. Nota che il 6 è il carattere che inizia da a in addr

Quindi nel comando corretto $2 è $0 (che stampa l'intera riga.) e index($0,$9) corrisponde a $9 e stampa tutto prima della colonna 9. Puoi cambiarlo in index($0,$8) e vedere che l'output cambia a

# 10:55 File with spaces 2

`index(IN, FIND)'Cerca nella stringa IN la prima occorrenza della stringa FIND, e restituisce la posizione in caratteri in cui quell'occorrenza inizia nella stringa IN.

Spero possa essere d'aiuto. Inoltre, se si assegna questo valore a una variabile nello script, è necessario racchiudere le variabili tra virgolette. Altrimenti otterrai errori se stai facendo qualche altra operazione per il nome del file estratto.


Linux
  1. Trova file e directory su Linux con il comando find

  2. Crittografia e decrittografia dei file semplificate con GPG

  3. Crittografia e decrittografia dei file con ccrypt

  4. Utenti e domini virtuali con Sendmail

  5. Trova un file con i comandi Trova e individua in Linux

Comando zip e decomprimi Linux con esempi

Spiegazione di Soft Link e Hard Link in Linux con esempi

Manipolazione del testo con sed e grep

Come lavorare con File e Shell Provisioner in Vagrant

For Loop con nomi di file?

Gestisci le autorizzazioni di directory e file con chmod Recursive