Ich muss Dateien aus einem Ordner in einen Unterordner verschieben. Da dies ein Vorgang ist, der mehr als einmal ausgeführt werden kann, ist der Unterordner möglicherweise nicht leer.
Nehmen wir an, die Struktur ist wie folgt:
renatospaka@dell-w10home:~/devlpm$ ls -la
total 24
drwxr-xr-x 4 renatospaka renatospaka 4096 Sep 8 12:36 .
drwxr-xr-x 10 renatospaka renatospaka 4096 Sep 8 12:34 ..
drwxr-xr-x 2 renatospaka renatospaka 4096 Sep 8 12:36 api
-rw-r--r-- 1 renatospaka renatospaka 10 Sep 8 12:36 file1.txt
-rw-r--r-- 1 renatospaka renatospaka 10 Sep 8 12:36 file2.txt
drwxr-xr-x 2 renatospaka renatospaka 4096 Sep 8 12:34 new
Es gibt dieses ausgezeichneteFrageaus dem ich den folgenden Befehl extrahiert habe: ls | grep -v new | xargs mv -t new
. Es funktioniert wirklich und verschiebt den Inhalt in dieneuOrdner. Ab der zweiten Ausführung tritt jedoch ein Fehler auf, da der Zielordner nicht leer ist und der Vorgang abgebrochen wird.
Wie kann ich dieses Problem beheben? Ich habe einige Flaggenkombinationen ausprobiert, xargs
aber alle sind fehlgeschlagen ...
Antwort1
mv
beschwert sich, weil es keine Argumente von erhält xargs
. Fügen Sie Folgendes hinzu -r
, um xargs
die Ausführung zu verhindern, wenn die Eingabe leer ist:
-r, --no-run-if-empty
If the standard input does not contain any nonblanks, do not run the command. Normally, the command is run once even if there is no in‐
put. This option is a GNU extension.
Sie können außerdem mv
das Verhalten steuern, wenn ein Ziel vorhanden ist:
Sehen man mv
:
-f, --force
do not prompt before overwriting
-i, --interactive
prompt before overwrite
-n, --no-clobber
do not overwrite an existing file
Also:
... | xargs -r mv -f -t new
Ihr Befehl hat jedoch ernsthafte Probleme, wenn Ihre Dateien Zeilenumbrüche oder sogar Leerzeichen enthalten. Im AllgemeinenAnalysieren Sie nicht die Ausgabe vonls
.