GNU/Linux >> LINUX-Kenntnisse >  >> Linux

AWK und Dateinamen mit Leerzeichen darin.

Das Problem hier ist das Parsen mit ls . Sehen Sie sich hier einmal an:Warum Sie die Ausgabe von ls nicht parsen sollten.

Der Grund, warum Sie dies nicht tun sollten, ist, dass UNIX fast jedes Zeichen in einem Dateinamen zulässt, einschließlich Leerzeichen, Zeilenumbrüche, Kommas, Pipe-Symbole und so ziemlich alles andere, was Sie jemals als Trennzeichen verwenden würden, außer NUL. Im Standardmodus, wenn die Standardausgabe kein Terminal ist, ls trennt Dateinamen mit Zeilenumbrüchen. Dies ist in Ordnung, bis Sie eine Datei mit einem Zeilenumbruch im Namen haben.


Oh mein Gott, das ist schrecklich.

Ihr Skript verwendet bash; Ich schlage vor, dass Sie stattdessen Folgendes tun:

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

Weitere Informationen finden Sie im Bash-Leitfaden für weitere Details zur Parametererweiterung.


Sie könnten dies versuchen.

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

Dies ist beispielsweise die Ausgabe des ls-Befehls:

-rw-r--r--. 1 root root 73834496 6. Dezember 10:55 Datei mit Leerzeichen 2

Wenn Sie einfaches awk wie dieses verwenden

# awk '{print $9}'

Es gibt nur

zurück
# File

Bei Verwendung mit dem vollständigen Befehl

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

Ich erhalte die gesamte Ausgabe

Datei mit Leerzeichen 2

Heresubstr(s, a, b) :Es gibt eine Anzahl von b Zeichen aus der Zeichenfolge s zurück, beginnend bei Position a. Der Parameter b ist optional.

Zum Beispiel, wenn die Übereinstimmung addr:192.168.1.133 ist und Sie substr wie folgt verwenden

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

Sie erhalten die IP, dh 192.168.1.133. Beachten Sie, dass die 6 das Zeichen ist, das mit einem in addr beginnt

Im richtigen Befehl ist $2 also $0 (was eine ganze Zeile druckt.) und index($0,$9) stimmt mit $9 überein und druckt alles vor Spalte 9. Sie können das in index($0,$8) ändern und sehen, dass sich die Ausgabe ändert zu

# 10:55 File with spaces 2

`index(IN, FIND)'Dies durchsucht die Zeichenfolge IN nach dem ersten Vorkommen der Zeichenfolge FIND und gibt die Position in Zeichen zurück, an der dieses Vorkommen in der Zeichenfolge IN beginnt.

Ich hoffe, es hilft. Wenn Sie diesen Wert einer Variablen im Skript zuweisen, müssen Sie die Variablen außerdem in doppelte Anführungszeichen setzen. Andernfalls erhalten Sie Fehler, wenn Sie eine andere Operation für den extrahierten Dateinamen ausführen.


Linux
  1. Linux + Wie ignoriert (filtert) man Dateien mit Leerzeichen?

  2. For-Schleife mit Dateinamen?

  3. Virtuelle Benutzer und Domänen mit Sendmail

  4. Suchen Sie eine Datei mit den Befehlen Suchen und Suchen in Linux

  5. Datei- und Ordnerberechtigungen mit rsync beibehalten

Linux Zip- und Unzip-Befehl mit Beispielen

Erläuterung von Soft Link und Hard Link in Linux anhand von Beispielen

Bearbeiten von Text mit sed und grep

So arbeiten Sie mit File and Shell Provisioner in Vagrant

Verwalten Sie Verzeichnis- und Dateiberechtigungen mit chmod Recursive

Wie ändere ich eine Datei direkt mit awk? (wie bei sed -i)