Wie behandelt man Leerzeichen in Verzeichnisnamen mit grep?

526
user1334007

Ich habe einen Verzeichnisbaum, in dem einige Verzeichnisse Leerzeichen in den Namen enthalten:

top |-- subdir 1 |-- subdir a |-- file1.csv |-- file2.csv |-- subdir b |-- file1.csv |-- subdir c |-- file3.csv 

Ich möchte einen grepBefehl zum rekursiven Suchen von Text in der Verzeichnisstruktur schreiben, aber die Ausgabe muss nach dem Zeitstempel der Dateien sortiert werden. Die Schließungen, die ich bekommen habe, sind folgende:

find . -name *.csv | sort | xargs grep "some text" -0 

Das Problem ist, dass die Räume wegwerfen grepund man Ergebnisse wie diese bekommt

grep: ./subdir: Keine solche Datei oder Verzeichnis.
grep: 1: Keine solche Datei oder Verzeichnis

Es interpretiert subdir 1als zwei separate Verzeichnisse subdirund 1. Wie kann ich das machen?

0

1 Antwort auf die Frage

0
Kamil Maciorowski

Ja, diese Leerzeichen sind das Problem. Wenn die von Ihnen verwendeten Tools mit nullterminierten Strings arbeiten können, gehen Sie folgendermaßen vor:

find . -name "*.csv" -print0 | sort -z | xargs -0 grep "some text" 

Dieser Ansatz sollte auch in Ihrem Fall funktionieren:

find . -name "*.csv" | sort | xargs -I {} grep "some text" {} 

Anmerkungen:

  • Ich weiß nicht, wie dies dazu führt, sortdass "die Ausgabe nach dem Zeitstempel der Dateien sortiert wird". Ich debugiere gerade Ihren Befehl.
  • Sie müssen *.csvwie ich zitieren, um dieses Szenario zu vermeiden .