Скрипт для переименования файлов с логическим - PullRequest
1 голос
/ 29 февраля 2012

Кто-то очень любезно помог мне начать работу со сценарием массового переименования для переименования файлов PDF.

Как вы видите, мне нужно добавить немного логики, чтобы остановить происходящее ниже - так что-то вроде добавления уникального номера к дублирующему имени файла?

rename 's/^(.{5}).*(\..*)$/$1$2/' *

rename -n 's/^(.{5}).*(\..*)$/$1$2/' *
Annexes 123114345234525.pdf renamed as Annex.pdf
Annexes 123114432452352.pdf renamed as Annex.pdf

Надеюсь, это имеет смысл?

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012
for i in *
do
    x=''                     # counter
    j="${i:0:2}"             # new name
    e="${i##*.}"             # ext
    while [ -e "$j$x" ]      # try to find other name
    do
        ((x++))              # inc counter
    done
    mv "$i" "$j$x"           # rename
done

до

$ ls
he.pdf  hejjj.pdf  hello.pdf  wo.pdf  workd.pdf  world.pdf

после

$ ls
he.pdf  he1.pdf  he2.pdf  wo.pdf  wo1.pdf  wo2.pdf
0 голосов
/ 29 февраля 2012

Как отмечено в моем ответе на ваш предыдущий вопрос:

for f in *.pdf; do 
    tmp=`echo $f | sed -r 's/^(.{5}).*(\..*)$/$1$2/'`
    mv -b ./"$f" ./"$tmp"
done

Это сделает резервные копии удаленных или перезаписанных файлов. Лучшей альтернативой был бы этот скрипт:

#!/bin/bash
for f in $*; do
    tar -rvf /tmp/backup.tar $f
    tmp=`echo $f | sed -r 's/^(.{5}).*(\..*)$/$1$2/'`
    i=1
    while [ -e tmp ]; do
        tmp=`echo $tmp | sed "s/\./-$i/"`
        i+=1
    done
    mv -b ./"$f" ./"$tmp"
done

Запустите скрипт так:

find . -exec thescript '{}' \;

Команда find предоставляет множество опций для указания, какие файлы запускать, работает рекурсивно и передает все имена файлов в сценарий. Сценарий выполняет резервное копирование всех файлов с помощью tar (без сжатия), а затем переименовывает их.

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

0 голосов
/ 29 февраля 2012

Это должно проверить, будут ли дубликаты:

rename -n [...] | grep -o ' renamed as .*' | sort | uniq -d

Если вы получите какой-либо вывод вида renamed as [...], значит, у вас есть коллизия.

Конечно, это не сработает в паре угловых случаев - например, если ваши файлы содержат символы новой строки или буквальную строку renamed as.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...