2

У меня в папке разные файлы, и я подумал, что могу просто сделать:

mv '*.(png|jpg|gif)' images/

чтобы они были перемещены в папку изображений. Но это не работает ... какие-нибудь мысли?

3 ответа3

4

Используйте функцию в bash, которая называется расширением скобок

mv *.{png,gif,jpg} images
1
mv *.png *.jpg *.gif images/

должен сделать это

1

А какую оболочку вы используете?

У Гоксу правильный ответ. Нет причин, по которым вы должны делать что-то более эзотерическое, если вы можете сделать это более простым и понятным способом.

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

Однако, если вы хотите быть Mister Fancy Pants, вы должны знать, что и Bash, и Kornshell (оба доступны в OS X) могут делать следующее, используя расширенные выражения glob:

$ mv *(*.png|*.jpg|*.gif) images

Расширенные выражения глобуса (так называемое сопоставление с образцом) действительно полезны, когда вы хотите удалить из каталога все, кроме одного файла. Например, вы расширили архив tar и хотите удалить все файлы, кроме архива tar:

$ rm -rf !(foo.tar.gz)

Особенность Bash в том, что сначала вы должны включить эту функцию с помощью команды shopt :

$ shopt -s extglob

Взгляните на справочную страницу Bash и посмотрите на раздел Pattern Matching. Он содержит множество аккуратных трюков с оболочкой, о которых не так много людей знают. Он дает вашей оболочке некоторые секретные сверхсилы, но всегда помните об их использовании, чтобы помочь человечеству, а не во зло.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .