xargsjest narzędziem do pracy. To lub findz -exec … {} +. Te narzędzia uruchamiają polecenie kilka razy, z tyloma argumentami, ile można przekazać za jednym razem.
Obie metody są łatwiejsze do przeprowadzenia, gdy lista argumentów zmiennych znajduje się na końcu, co nie ma miejsca w tym przypadku: ostatnim argumentem mvjest miejsce docelowe. W przypadku narzędzi GNU (tj. W niewbudowanym systemie Linux lub Cygwin) -topcja mvjest przydatna, aby najpierw przekazać miejsce docelowe.
Jeśli nazwy plików nie mają białych znaków ani żadnego z nich \"', możesz po prostu podać nazwy plików jako dane wejściowe xargs( echopolecenie jest wbudowane w bash, więc nie podlega limitowi długości wiersza poleceń):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Możesz użyć -0opcji, aby xargsużyć danych rozdzielanych znakami null zamiast domyślnego formatu cytowanego.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Alternatywnie możesz wygenerować listę nazw plików za pomocą find. Aby uniknąć rekurencji w podkatalogach, użyj -type d -prune. Ponieważ dla wymienionych plików obrazów nie określono żadnej akcji, przenoszone są tylko inne pliki.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Obejmuje to pliki kropkowe, w przeciwieństwie do metod wieloznacznych powłoki).
Jeśli nie masz narzędzi GNU, możesz użyć powłoki pośredniej, aby uzyskać argumenty we właściwej kolejności. Ta metoda działa na wszystkich systemach POSIX.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
W Zsh możesz załadować mvwbudowane :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
lub jeśli wolisz pozwolić, mva inne nazwy nadal odnoszą się do poleceń zewnętrznych:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
lub z globami w stylu ksh:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Alternatywnie, używając GNU mvi zargs:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/