Dateiname mit Leerzeichen, die an zwei xargs-Befehle weitergeleitet werden


1

Ich habe ein Verzeichnis und viele weitere Unterverzeichnisse wie das folgende -

file with spaces.txt
filewithsuperlonglines.txt
ordinaryfile.txt
binaryfile.bin

Der Befehl -

finden . -Typ f -print0 | xargs -0 Datei | grep text | grep -v long | cut -d: -f1

Erzeugt die richtige Liste von Dateien (dh Textdateien, die keine sehr langen Zeilen enthalten)

./file with spaces.txt
./ordinaryfile.txt

Aber wenn ich am Ende des Befehls ein weiteres xargs hinzufüge, erhalte ich Fehler -

finden . -Typ f -print0 | xargs -0 Datei | grep text | grep -v long | ausschneiden -d: -f1 | xargs -0 awk -f someprocessing.awk

gawk: someprocessing.awk:3: fatal: cannot open file `./file' for reading (No such file or directory)

Der Inhalt von someprocessing.awk ist nicht relevant, da ich den gleichen Fehler erhalte, wenn ich catstattdessen den Befehl verwende.

Wie erhalte ich den Befehl nach der letzten Pipe, um mit Dateien mit Leerzeichen im Namen zu arbeiten?

Antworten:


2

find -print0Erzeugt eine Ausgabe mit Nullzeichen als Begrenzer. xargs -0erfordert die Eingabe von Nullzeichen als Trennzeichen. Ihr erster xargsBefehl erhält seine Nullzeichen von find; In der zweiten werden stattdessen Zeilenumbrüche angezeigt.

Versuche dies:

find . -type f -print0 | \
    xargs -0 file | \
    grep text | \
    grep -v long | \
    cut -d: -f1 | \
    tr '\n' '\0' | \
    xargs -0 awk -f someprocessing.awk

(Dies sollte für die GNU Coreutils-Version von funktionieren tr; bei anderen trImplementierungen bin ich mir nicht sicher .)


0

Die akzeptierte Lösung ist fehlerhaft, wenn der Dateiname ":" enthält. Das Folgende schlägt nur fehl, wenn die Dateinamen ':' enthalten und die \ 0-Manipulation vermieden wird:

find . -type f | parallel file | grep text | grep -v long |\
parallel --colsep ': ' awk -f someprocessing.awk {1}

Es verwendet GNU Parallel, so dass Sie die awk kostenlos parallel ausführen können.

Sehen Sie sich die Intro-Videos an, um mehr zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.