У меня есть папка с несколькими файлами в ней ABC. * (Примерно 100 таких файлов). Я хочу скопировать их все в новые файлы с именами, начинающимися с DEF. *
Я хочу
ABC.Page1
ABC.Page2
ABC.Topic12
...etc
скопированы в
DEF.Page1
DEF.Page2
DEF.Topic12
...etc
Какой самый простой способ сделать это с помощью пакетной команды (в BASH или аналогичной)? Я думаю о чем-то, касающемся sed, awk или xargs, но мне сложно разобраться в синтаксисе. Я мог бы написать скрипт на Python, но я думаю, что, возможно, есть решение для командной строки, которое не слишком сложно.
mc
файлового менеджера есть самая обширная поддержка для такого рода массовых переименований.tar
не весенний цыпленок. Смотрите мой ответ для примера.Ответы:
Как насчет этого в bash:
Вы можете проверить это, поместив echo перед командой cp:
источник
cp /usr/local/lib/libboost* /usr/local/lib/libboost*
с проверкой эха.Чтобы сделать это эффективно с большим количеством файлов, лучше избегать запуска отдельного
cp
процесса для каждого из них. Одним из способов было бы скопировать, а затем переименовать их, используяprename
(rename
по умолчанию это ссылка на дистрибутивы на основе Debian). Используя это и Linuxmktemp
:Обновить
На самом деле
pax
может быть лучше пойти сюда:К сожалению, несмотря на то,
pax
что это стандартная база POSIX и Linux, лишь немногие дистрибутивы в настоящее время включают ее по умолчанию.источник
tar
сделаю это для вас очень быстро.ТЕСТ
Сначала я создал 2 каталога и 10 файлов:
Затем я скопировал их:
ПРЕОБРАЗОВАНИЯ
Поэтому GNU
tar
приметsed --transform=EXPRESSION
переименование файла. Это может даже переименовать только некоторые файлы. Например:Так что это одно преимущество.
РУЧЕЙ
Также учтите, что это только два
tar
процесса - и это не изменится, независимо от количества файлов.tar
настолько оптимизирован, насколько вы могли бы пожелать. У этого никогда не будет проблемных аргументов или сбежавших дочерних процессов. Это просто A> B сделано.АРГУМЕНТЫ
Я использую 7 различных аргументов, объединенных между моими двумя
tar
процессами. Самый важный из них перечислен здесь первым:... и на другой стороне
|pipe
...источник
pax
решение этого вопроса. Я бы добавил его в свой ответ, но я думаю, что он лучше подходит здесь -pax -rws '/^ABC/DEF/' ABC.* .
pax
указать это в своем ответе - указан POSIX - отсюда иpax
.pax
может быть POSIX, но, к сожалению, он редко устанавливается по умолчанию.Если вы не возражаете против использования менее стандартного инструмента, я рекомендую использовать mmv (массовый ход), который был написан для такого рода задач. Используя
mcp
(массовое копирование), который является частью пакета, вы можете просто сделатьНайти загружаемые пакеты не так просто. Текущий пакет Debian (который Arch также использует в AUR) для компиляции дома можно найти здесь .
источник
apt-get install mmv
В zsh поместите следующие строки в ваш
.zshrc
:Затем в командной строке вы можете запустить
или просто
В другой оболочке, если у вас установлен zsh:
источник
Вы могли бы сделать это:
источник
"${i#*.}"
немного?Вы можете сделать это: http://www.projectik.eu/index.php/programovanie/linux/item/243-linux-kopirovanie-suborov-vo-vlakne Вот пример
источник