условно переименовывать файлы на основе регулярных выражений - PullRequest
1 голос
/ 17 апреля 2020

У меня есть эта функция "fileSuffix", которая будет переименовывать "everything.mp3" в "everything.s.mp3"

https://gist.github.com/chapmanjacobd/4b07d0f64b64ac6fa70056aa44ec02a7

function fileSuffix
    set filen (string split -r -m1 . "$argv[1]")[1]
    set filex (string split -r -m1 . "$argv[1]")[2]
    echo $filen.$argv[2].$filex
end

Я хотел бы изменить эту функциональность на:

1) проверить, имеет ли файл /\.\d+\./ и, если да, повторить имя файла:

"test.1.mp3" -> "test. 2.mp3 "

2) если файл не имеет /\.\d+\./, добавьте" .1. " между расширением и именем файла

"test.mp3" -> "test.1.mp3"

Я не знаю лучший способ сделать это. Я пытался string split -r -m1 /\.\d+\./ "test.test.1.test", но это не работает

1 Ответ

3 голосов
/ 17 апреля 2020

Я бы написал:

function incrFileSuffix
    for file in $argv
        set match (string match -e -r '(.+)\.(\d+)\.([^.]+)' $file)
        if test $status -eq 0
            set root $match[-3]
            set n (math $match[-2] + 1)
            set ext $match[-1]
        else
            set match (string match -e -r '(.+)\.([^.]+)' $file)
            if test $status -ne 0
                # file does not have a dot. what to do?
                return
            end
            set root $match[-2]
            set n 1
            set ext $match[-1]
        end
        echo mv $file $root.$n.$ext
    end
end

, затем

$ incrFileSuffix foo

$ incrFileSuffix foo.bar
mv foo.bar foo.1.bar

$ incrFileSuffix foo.bar.2.baz
mv foo.bar.2.baz foo.bar.3.baz

Ссылка https://fishshell.com/docs/current/cmds/string-match.html

...