xargs
jest narzędziem do pracy. To lub find
z -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 mv
jest miejsce docelowe. W przypadku narzędzi GNU (tj. W niewbudowanym systemie Linux lub Cygwin) -t
opcja mv
jest 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
( echo
polecenie 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ć -0
opcji, aby xargs
uż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ć mv
wbudowane :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
lub jeśli wolisz pozwolić, mv
a 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 mv
i zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/