Копіювання файлів з декількома розширеннями


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/?
iruvar

Відповіді:


56

Розширення брекетів виконає роботу. man bashі шукати Brace Expansion.

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

Редагувати:

Відповідно до запиту ОП, у вищезазначеній команді відсутня паралельна опція:

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

2
Чи можу я це зробити в Windows?
серхіол

Якщо у мене є, 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

Це працює!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.