xargs
є інструментом для роботи. Що, або find
з -exec … {} +
. Ці інструменти виконують команду кілька разів із стільки аргументів, скільки можна передавати за один раз.
Обидва методи легше здійснити, коли список аргументів змінної знаходиться в кінці, що тут не так: останнім аргументом mv
є адресат. З утилітами GNU (тобто на невбудованому Linux або Cygwin) -t
можливість mv
корисно передати пункт призначення спочатку.
Якщо в іменах файлів немає білого простору або будь-якого з них \"'
, тоді ви можете просто надати імена файлів у якості вхідних даних xargs
( echo
команда є вбудованим bash, тому це не обмежується довжиною командного рядка):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Ви можете скористатися -0
опцією, щоб xargs
використовувати введений з нулем розмір, а не формат, котируваний за замовчуванням.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Крім того, можна створити список імен файлів за допомогою find
. Щоб уникнути повторної повторної роботи в підкаталогах, використовуйте -type d -prune
. Оскільки для перелічених файлів зображень не вказано жодної дії, переміщуються лише інші файли.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Це включає файли крапок, на відміну від методів підстановки оболонок.)
Якщо у вас немає утиліт GNU, ви можете використовувати проміжну оболонку, щоб отримати аргументи в потрібному порядку. Цей метод працює у всіх системах POSIX.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
У zsh ви можете завантажити mv
вбудований :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
або якщо ви віддаєте перевагу дозволити mv
та інші імена продовжувати посилатися на зовнішні команди:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
або з глобусами у стилі ksh:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Крім того, використовуючи GNU mv
та zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/