2013-05-06 2 views
0

Моя текущая задача переименовывает множество файлов по нескольким каталогам в разные идентификаторы.Как извлечь определенные части пути и имени файла в linux

Поэтому у меня есть несколько каталогов, таких как: b01, b02, b03 и т.д. В каждом каталоге есть имена файлов, такие как img01.23495.png, img01.3596596.png, img02.2399495.png и т.д.

Мне нужно переименовать img01 из b01 в другой идентификатор. Таким образом, идентификатор зависит от имени каталога и первой части имени файла.

Мои мысли о конвейере таковы: получить все имена файлов png, извлечь папку, в которой она находится, извлечь часть img ## и сохранить информацию в файле, поэтому я бы получил файл с чем-то вроде :

b01 img01
b01 img02
b02 img01
...

Это полезно, так что я могу указать послесловие, что новый идентификатор в качестве третьего столбца, а затем прочитать в файле, чтобы выполнить фактическое переименование.

В настоящее время у меня есть пути, такие как ./images/something/b01/img01.2342394.png.

Чтобы получить список, я в настоящее время пытается что-то вроде find . | grep png | something sed | sort | uniq > indentifiers.txt

Я застрял на sed части, однако. Также приветствуются любые предложения делать то, что я пытаюсь сделать.

+1

'find. -name "* .png" | sed 's /^ .* \/\ ([^ \ /] * \) \/\ ([^ \ /] * \) \ .png $/\ 1 \ 2/| sort -u'? Это кажется ненужным по сравнению с итерацией. Вам будет интересно написать фактический скрипт или функцию, которая делает это все сразу? – FrankieTheKneeMan

+0

Спасибо! Я нашел хороший сайт, чтобы сделать некоторые эксперименты в regexp, и изменил ваше регулярное выражение на find . -name "*.png" | sed 's/^.*\/\([^\/]*\)\/\(img[0-9][0-9]\)\([^\/]*\)\.png$/\1 \2/ | sort -u. Что вы подразумеваете под итерацией? – vsector

+0

Я просто имею в виду, что переходить через список дважды кажется ненужным. – FrankieTheKneeMan

ответ

1
find . -name "*.png" | sed 's#^.*/\([^/]*\)/\([^/.]*\)\.[0-9]\+\.png$#\1 \2#' | sort -u 

К сожалению, я не могу получить полный тест на что - я на работе и застрял на OSX, который имеет странные sed вопросы. В любом случае, ядро ​​решения (помимо использования теста -name для find и флага -u для sort) является стандартным выражением sed. У вас, кажется, есть ручка, но я объясню все это на случай, если кто-нибудь найдет ее:

s - Search and Replace 
    # - Delimiter (Search pattern) 
    ^- Beginning of a line 
    . - Any character 
    * - zero or more times 
    /- a literal '/' 
    \(- start a capturing group 
     [^/]* - Any character except '/', zero or more times 
    \) - End capturing group (#1) 
    /- a literal '/' 
    \(- start a capturing group 
     [^/.]* - Any character except '/' or '.', zero or more times 
    \) - End capturing group (#2) 
    \. - a literal '.' 
    [0-9] - a digit 
    \+ - one or more times 
    \.png - a literal '.png' 
    $ - end of the line 
    # - Delimiter, now starting the replace pattern 
    \1 - the contents of the first capturing group 
     - a space 
    \2 - the contents of the second capturing group 
    # - Delimiter. End of all patterns. 
+0

Спасибо за фантастическую помощь! – vsector

Смежные вопросы