Копирование файлов с несколькими расширениями

22

Я хотел бы скопировать файлы с несколькими расширениями в один каталог назначения.

Например, я могу использовать следующую команду, чтобы скопировать все файлы .txt в рабочем каталоге в каталог с именем destination:

cp -v *.txt destination/

И я могу использовать следующее, чтобы скопировать все каталоги .png в рабочем каталоге destination:

cp -v *.png destination/

Но это занимает много времени, чтобы ввести их как отдельные команды (даже с использованием истории команд). Итак, есть ли способ , что я могу сказать , cpчтобы скопировать файлы с любым шаблоном *.txt или шаблоном *.pngк destination? В идеале я хотел бы иметь возможность указать более двух моделей - как инструктаж , cpчтобы скопировать все *.txt или *.png или *.jpg файлы destination, например.

Я уверен, что все это возможно с помощью сценария оболочки - я использую bash, например - но есть ли способ сделать это проще, просто с консоли? Могу ли я как-то использовать расширение скобки, чтобы сделать это?

Я знаю, что можно копировать все файлы в рабочем каталоге, кроме тех, которые соответствуют определенным заданным шаблонам , но, поскольку мой рабочий каталог содержит гораздо больше расширений файлов, которые я не хочу копировать, чем те, которые я делаю , это будет проблемой.

Есть ли у вас какие-либо мысли по этому поводу?

Эндрю
источник
10
cp -v *.txt *.png destination/?
Ирувар

Ответы:

56

Расширение скобки сделает работу. man bashи искать Brace Expansion.

cp *.{txt,jpg,png} destination/

РЕДАКТИРОВАТЬ:

В соответствии с запросом OP, в приведенной выше команде отсутствовал подробный параметр:

cp -v *.{txt,jpg,png} destination/
Тимоти Мартин
источник
2
Могу ли я сделать это на Windows?
sergiol
Если я делаю, cp data/images/*.{jpg,jpeg,png,mp4} destination/а mp4файл не существует, я получаю No such file or directoryошибку, которая нарушает работу сценария. Могу ли я сделать несколько расширений изящно обрабатывать любые пропущенные форматы?
BradGreens
1
@BradGreens Вы должны действительно отправить новый вопрос, а не задавать его здесь в комментариях. Ваш вопрос может даже иметь ответ. Публикация нового вопроса не только даст вам ответ, но и тогда будет доступен для поиска другим, кто нуждается в такой же помощи.
Тимоти Мартин
0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

Это работает!

Офек Орталь
источник