Перемещение нескольких имен файлов расширений в другой каталог

Вы можете сделать это (если я правильно прочитал ваш вопрос) следующим образом:

export EXECLOG = / home / user cd $ EXECLOG / temp / somefolder

В основном настроена ваша замену в оболочке и доступ к ним путем префикса их знаком «$». Стандартные переменные оболочки.

(для исправления опечатки в EXECLOG)

1
задан 13 November 2015 в 23:25

3 ответа

Вы должны использовать -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.

6
ответ дан 23 May 2018 в 15:48

Вы можете сделать это, используя только 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
5
ответ дан 23 May 2018 в 15:48
  • 1
    Замечание (не для вас, для других людей, читающих это): extglob всегда отключается, когда Bash запускается неинтерактивно (скрипт, bash -c и т. Д.), Но он всегда включен, когда Bash запускается интерактивно, t нужно включить extglob, если вы не запускаете это из сценария (или из bash -c). – kos 14 November 2015 в 13:41
Команда

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
2
ответ дан 23 May 2018 в 15:48

Другие вопросы по тегам:

Похожие вопросы: