mv beschwert sich über die Standardeingabe in einer Pipeline, die Dateinamen mit grep filtert

mv beschwert sich über die Standardeingabe in einer Pipeline, die Dateinamen mit grep filtert

Ich versuche, mehrere AVI-Dateien mit Leerzeichen von einer CD in meinen Home-Ordner zu verschieben. Ich weiß bereits, wie ich die Leerzeichen entfernen kann:

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

Aber ich habe Mühe, die bearbeiteten Dateien zu finden und sie en masse in den Ordner zu verschieben. Ich erhalte immer wieder den Fehler mv: cannot stat '(standard input)': No such file or directory. Dies ist der Code, den ich zu verwenden versuche:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

Kann mir bitte jemand sagen, was ich falsch mache?

Antwort1

Ihr Problem ist der -LWechsel zu grep. Aus der Manpage:

L, --files-without-match
Unterdrückt die normale Ausgabe; druckt stattdessen den Namen jeder Eingabedatei, von der normalerweise keine Ausgabe gedruckt worden wäre. Der Scan wird bei der ersten Übereinstimmung angehalten.

Anstatt also dieDateinamendie nicht übereinstimmen, avilistet nur dieOrtwhere grepwurde nicht gefunden avi. Da grepnormalerweise in einer Datei gesucht wird, würde ein solcher Schalter Dateinamen auflisten, die das Muster nicht enthalten . In Ihrem Fall jedoch, da Sie von aviweiterleiten , ist die gelesene Datei . Um zu sehen, was ich meine, versuchen Sie:grepfindgrep(standard input)

find /media/mathscd | grep -L "*.avi"

Ergebnis:

(standard input)

Mit anderen Worten: grepEs wurden Zeilen gefunden, die nicht "*.avi"mit der Standardeingabe übereinstimmten, und genau das ist passiert.

Da findDateinamen direkt aufgelistet werden, müssen Sie nur die Richtung der Übereinstimmung umkehren:

find /media/mathscd | grep -v ".*\.avi"

(Beachten Sie, dass grepMuster sich von Shell-Platzhaltern unterscheiden; Sie benötigen den Schalter auch nicht -r)

Auch bei findalleiniger Verwendung:

find /media/mathscd ! -name "*.avi"

Antwort2

Versuchen Sie eines davon:

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

Testen Sie es unbedingt, indem Sie es zuerst xargs mv*durch ersetzen xargs ls.

verwandte Informationen