xargs
ist das Werkzeug für den Job. Das oder find
mit -exec … {} +
. Diese Tools führen einen Befehl mehrmals mit so vielen Argumenten aus, wie auf einmal übergeben werden können.
Beide Methoden sind einfacher durchzuführen, wenn die Liste der variablen Argumente am Ende ist, was hier nicht der Fall ist: Das letzte Argument mv
ist das Ziel. Bei GNU-Dienstprogrammen (z. B. unter nicht eingebettetem Linux oder Cygwin) ist die -t
Option to mv
nützlich, um das Ziel zuerst zu übergeben.
Wenn die Dateinamen weder Leerzeichen noch Leerzeichen enthalten \"'
, können Sie die Dateinamen einfach als Eingabe für angeben xargs
(der echo
Befehl ist eine integrierte Bash, daher unterliegt er nicht der Begrenzung der Befehlszeilenlänge):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Sie können die -0
Option verwenden, xargs
um eine durch Nullen getrennte Eingabe anstelle des in Anführungszeichen gesetzten Standardformats zu verwenden.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Alternativ können Sie die Liste der Dateinamen mit erzeugen find
. Verwenden Sie -type d -prune
. Da für die aufgelisteten Bilddateien keine Aktion angegeben ist, werden nur die anderen Dateien verschoben.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Dies schließt im Gegensatz zu den Shell-Platzhaltermethoden Punktdateien ein.)
Wenn Sie keine GNU-Dienstprogramme haben, können Sie eine Zwischen-Shell verwenden, um die Argumente in der richtigen Reihenfolge abzurufen. Diese Methode funktioniert auf allen POSIX-Systemen.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
In zsh können Sie das mv
eingebaute laden :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
oder wenn Sie es vorziehen zu lassen mv
und andere Namen weiterhin auf die externen Befehle verweisen:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
oder mit ksh-style globs:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Alternativ mit GNU mv
und zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/