Вы можете сделать это (если я правильно прочитал ваш вопрос) следующим образом:
export EXECLOG = / home / user cd $ EXECLOG / temp / somefolderВ основном настроена ваша замену в оболочке и доступ к ним путем префикса их знаком «$». Стандартные переменные оболочки.
(для исправления опечатки в EXECLOG)
Вы должны использовать -regex вместо -name - с -name, для каждого расширения потребуется отдельный тест -name:
find .. -name '*.mp4' -name '*.avi' ...
Вместо:
find -regextype posix-extended ... -regex '.*\.(mp4|avi|...)' ...
] С учетом вашего массива do (отключение ненужного xargs):
find "$SOURCE" -regextype posix-extended -type f -regex ".*\.($(IFS="|"; echo "${MOVEFILES[*]}"))" -exec mv -t "$DESTDIR" {} +
IFS="|"; echo "${MOVEFILES[*]}" - способ распечатать каждый элемент в массиве MOVEFILES, разделенный |.
$MOVEFILES сам по себе является только первым элементом в массиве MOVEFILES.
Вы можете сделать это, используя только shell (bash):
shopt -s extglob globstar nullglob
mv -t /destination **/*(*.mpg|*.m4v|*.mpeg|*.mp4|*.avi|*.3gp|*.MOV)
Сначала нам нужно установить несколько параметров оболочки extglob, что позволит нам выполнять расширенное сопоставление образцов для имен файлов globstar, после включения этого, используя **, мы можем пройти через подкаталоги для поиска файлов. nullglob приведет к пустой строке, если имя файла не будет соответствовать нашим заданным шаблонам, а не самим шаблонам. Теперь [ f8] - это шаблон extglob, который будет соответствовать нулю или больше вхождений либо *.foo, либо *.bar. Таким образом, **/*(*.mpg|*.m4v|*.mpeg|*.mp4|*.avi|*.3gp|*.MOV) доставит нам файлы, которые будут перемещены. mv -t /destination **/*(*.mpg|*.m4v|*.mpeg|*.mp4|*.avi|*.3gp|*.MOV) переместит файлы в /destination , Пример:
$ tree
.
├── dest
├── foo
│ ├── bar
│ │ ├── baz.md
│ │ ├── egg.3gp
│ │ └── egg.mp4
│ ├── baz.txt
│ ├── spam.avi
│ └── spam.mp3
├── spamegg.MOV
└── spamegg.txt
$ shopt -s extglob globstar nullglob
$ mv -t dest/ **/*(*.mp3|*.mp4|*.avi|*.3gp|*.MOV)
$ tree
.
├── dest
│ ├── egg.3gp
│ ├── egg.mp4
│ ├── spam.avi
│ ├── spamegg.MOV
│ └── spam.mp3
├── foo
│ ├── bar
│ │ └── baz.md
│ └── baz.txt
└── spamegg.txt
find позволяет установить несколько условий с флагом -o, и вам действительно не нужно xargs, вы можете использовать -exec. Лично я сменил бы ваш скрипт на
#!/bin/bash
# script to find and move files
SOURCE=/DRIVE2/folder/
DESTDIR=/DRIVE/new3/
find "$SOURCE" -type f \( -name -o "*.mpg" -o -name "*.avi" -o -name "*.m4v" -o -name "*.mp4" -o -name "*.3gp" -o -name "*.mpeg" -o -name "*.MOV" \) -exec mv -t "$DESTDIR" {} +
. Другой подход был бы с циклом for, где мы работаем над каждым расширением отдельно
for EXT in ${MOVEFILES[@]}; do find "$SOURCE" -type f -name "*.$EXT" -exec mv -t "$DESTDIR" {} + ; done