Переименовывайте файлы в bash, сохраняя оригиналы без изменений - PullRequest
2 голосов
/ 21 июля 2010

У меня есть папка с множеством изображений для многоязычного сайта, изображения хранятся в следующем формате filename.lang_code.jpg, в сценарии развертывания я хочу выбрать правильный для сайта, который я развертываю скопируйте его в filename.jpg, чтобы я мог поделиться одним и тем же css между сайтами.

Итак, мне нужно что-то вроде команды переименовать, но выполнение копирования, а не перемещение, потому что мне нужно сохранить все файлы.

Я делаю это со следующим кодом, но я нахожу это слишком сложным и ужасным.

find -name "*.es.*" -print0 | xargs --null -I {} sh -c "echo {} | sed 's/.es//' | xargs -I }{ sh -c 'cp {} }{'"

Ответы [ 5 ]

2 голосов
/ 24 июля 2010

Этот тип копирования / переименования обычно проще выполнить в zsh, где вам не нужно писать цикл for или команду find.

zmv -Ls '(**)/(*).es.(*)' '$1/$2.$3'

-Ls предназначен для создания символических ссылок; замените на -C копию или ничего на ход. Другие полезные опции: -i (запрашивать подтверждение для каждой копии / перемещения) и -n (просто показать, что произойдет, но на самом деле не выполнять копирование / перемещение).

$1, $2, $3 в тексте замены относятся к первой, второй и третьей скобкам в шаблоне. В шаблоне **/ означает любую цепочку каталогов.

Может потребоваться сначала загрузить команду zmv с помощью autoload zmv. Это может быть полезно для ваших .zshrc, а также alias zcp='zmv -L' и alias zln='zmv -L'.

1 голос
/ 21 июля 2010
find -name '*.es.*' -exec bash -c 'cp "$1" "${1/.es./.}"' modlang {} \;
1 голос
/ 21 июля 2010

Баш 4

shopt -s globstar
for file in **/*.es*
do
  newfilename=${file/.es/}
  cp "$file" ""$newfilename"
done

использования find

find . -type f -iname "*.es.*" -print | sed 's/\(.*\)\.es\.\(.*\)/mv \1.es.\2 \1\2/' |bash
0 голосов
/ 21 июля 2010

Хм .. вы можете просто скопировать всю необходимую вам jpg, поместить их в нужный вам каталог и просто переименовать их оттуда?

Что-то вроде:

cp *.jpg /src /dst
cd /dst && rename 's/\.es//' *.jpg

Команда переименования является оболочкой для сценария Perl.

0 голосов
/ 21 июля 2010

Как насчет цикла for?

for x in *.es.* ; do
  xx=$(echo ${x} | sed 's/\.es//')
  cp ${x} ${xx}
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...