2015-04-21 2 views
0

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

some123_name4.with5.number01-02_and6-other7.stuff.txt 
some123_name4.with5.number05-06_and6-other7.stuff.txt 
some123_name4.with5.number11-12_and6-other7.stuff.txt 

, и я хотел бы переименовать их держать часть в середине числа ?? - ??. Например, например:

different45_start.keep76.number01-02_but.change34_rest.txt 
different45_start.keep76.number05-06_but.change34_rest.txt 
different45_start.keep76.number11-12_but.change34_rest.txt 

Я играл с expr, %% и? но мне даже не удалось извлечь номер ?? ?? часть имени файла.

ответ

2

Это должно сделать (заменить реальные модели)

#!/bin/bash 

for f in some123* ; do 
    mv $f `echo $f | sed -e 's/some123_name4.with5/different45_start.keep76/' -e 's/and6-other7.stuff/but.change34_rest/'` 
done 
+0

Обратите внимание, что выше предполагает старые имена файлов все начинаются и заканчиваются с идентичными узорами –

+0

Это очень красиво, просто и легко. – user4050567

1

Может ли я предложить вам использовать regexp'es извлечь ваши номера от старого имени в новое имя? Тогда это просто вопрос о

  • создает новый подкаталог (только в случае, если вы допустили ошибку)
  • с помощью «LS» в список имен файлов (с параметрами 1 (один) имя в строке, не следуя вниз в подкаталоги)
  • итерация имен файлов

В каждой итерации

  • установить новое имя
  • запустить копию COMMANDE «ф», используя старые и новые имена (но, как трюк, скопируйте в новый подкаталог)

В общем, что-то вроде этого:

mkdir NEW 
ls -1d some* \ 
| while read FILE; do 
     NEWFILE=`echo "$FILE" \ 
     | sed 's|^some12\\([0-9]\\)_name\\([0-9]\\)[.]with\\([0-9]\\)[.]number\\([0-9][0-9]-[0-9][0-9]\\)_and\\([0-9]\\)-other\\([0-9]\\)[.]stuff[.]txt$|different\\2\\3_start.keep\\6\\5.number\\4_but.change\\1\\2_rest.txt|'` 
     cp "$FILE" NEW/"$NEWFILE" 
done 

Как вы можете видеть, из-за обратных шагов (`) вам нужно использовать дополнительные обратные косые черты в регулярном выражении.

Помогло ли это вам в начале?

+0

Это выглядит очень интересно! Спасибо, что показал что-то новое и объяснил это :) – user4050567

1

возможное решение с использованием expr выглядит следующим образом:

for f in *number??-??*; do 
    fixedPart=$(expr "$f" : '.*\(number[0-9][0-9]-[0-9][0-9]\).*') 
    newName="different45_start.keep76.${fixedPart}_but.change34_rest.txt" 
    mv "$f" "$newName" 
done 
+0

Так я и искал, спасибо за это! – user4050567