
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 -L
Wechsel 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, avi
listet nur dieOrtwhere grep
wurde nicht gefunden avi
. Da grep
normalerweise in einer Datei gesucht wird, würde ein solcher Schalter Dateinamen auflisten, die das Muster nicht enthalten . In Ihrem Fall jedoch, da Sie von avi
weiterleiten , ist die gelesene Datei . Um zu sehen, was ich meine, versuchen Sie:grep
find
grep
(standard input)
find /media/mathscd | grep -L "*.avi"
Ergebnis:
(standard input)
Mit anderen Worten: grep
Es wurden Zeilen gefunden, die nicht "*.avi"
mit der Standardeingabe übereinstimmten, und genau das ist passiert.
Da find
Dateinamen direkt aufgelistet werden, müssen Sie nur die Richtung der Übereinstimmung umkehren:
find /media/mathscd | grep -v ".*\.avi"
(Beachten Sie, dass grep
Muster sich von Shell-Platzhaltern unterscheiden; Sie benötigen den Schalter auch nicht -r
)
Auch bei find
alleiniger 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
.