Дублирование файлов с похожими именами файлов в UNIX

У меня есть набор файлов в одном каталоге с именем:

OneThing-x.extension
OneThing-y.extension
OneThing-z.extension

Какую команду UNIX (find, cp, xargs, sed?) я использую для копирования их в

AnotherThing-x.extension
AnotherThing-y.extension
AnotherThing-z.extension

такие, что x ->copy-> x и y ->copy -> y

У меня есть часть команды find .. для начала, которая выбирает файлы, но я застрял там.

РЕДАКТИРОВАТЬ Очевидно, я хочу сохранить и оригинал, и копию, поэтому переименование не совсем подходит для меня.


person Felix Ogg    schedule 03.07.2009    source источник


Ответы (5)


Как насчет:

$ touch a1.a a2.a a3.a
$ ls

a1.a  a2.a  a3.a

$ for a in a*.a ; do cp $a $(echo $a | sed 's/^a/b/') ; done
$ ls

a1.a  a2.a  a3.a  b1.a  b2.a  b3.a
person Stephen Darlington    schedule 03.07.2009
comment
Предлагается самое короткое и элегантное решение. И это сработало как шарм! - person Felix Ogg; 03.07.2009
comment
Обычный колдовство в моем наборе инструментов (хотя я достаточно взрослый, чтобы по умолчанию использовать обратные кавычки). Иногда с находкой, чтобы получить список ввода. На что следует обратить внимание, так это на уникальность заменяющего регулярного выражения. Безопаснее всего запустить его с помощью echo вместо cp в первый раз. - person dmckee --- ex-moderator kitten; 03.07.2009
comment
Заключите в кавычки свои переменные оболочки на случай, если вы когда-нибудь будете использовать такие сценарии с именами файлов (или именами каталогов), которые содержат пробелы. (Мы не будем говорить об именах файлов, начинающихся с «-», потому что они просто злые.) - person ijw; 08.07.2009
comment
Настоящие пользователи Unix не создают имена файлов с пробелами или заглавными буквами (!). Но да, если это риск, переменные должны быть заключены в кавычки. И, как предлагает dmckee, запуск с эхом в первую очередь является действительно хорошей идеей. Я именно так и делаю. - person Stephen Darlington; 27.07.2009

Расширение решения Джейсона Масгроува:

for FIL in OneThing*
do
  NFIL=`echo $FIL | sed 's/OneThing/AnotherThing/'`
  cp "$FIL" "$NFIL"
done
person Douglas Leeder    schedule 03.07.2009
comment
Дуглас: Упс, да, я пропустил передачу echo $FIL в sed. Хороший улов. - person Jason Musgrove; 03.07.2009

Мое грубое решение будет примерно таким:

for FIL in OneThing*; do NFIL=`echo $FIL|sed 's/OneThing/AnotherThing/'`; cp "$FIL" "$NFIL"; done;
person Jason Musgrove    schedule 03.07.2009

Вы также можете использовать mmv:

$ mmv -c "OneThing*" "AnotherThing#1"

or

$ mmv -c "OneThing-*.extension" "AnotherThing-#1.extension"
person Mark van Lent    schedule 03.07.2009
comment
apt-get install mmv решит эту проблему, если вы используете дистрибутив на основе Debian. Я уверен, что базовые дистрибутивы RPM предоставляют аналогичный пакет. - person Mark van Lent; 03.07.2009

person    schedule
comment
Учитывая, что исходный вопрос запрашивал копию, это может фактически не дать требуемого результата. - person Jason Musgrove; 03.07.2009