Как я могу пакетно переименовать файлы? - PullRequest
1 голос
/ 05 апреля 2009

Я ищу скрипт (Perl, Python или пакет будет в порядке), который пройдет через назначенное файловое дерево и переименует все дочерние файлы.

Например, Folder1>File1.anytype становится Folder1>Folder1File1.anytype.

Спасибо

Ответы [ 5 ]

2 голосов
/ 05 апреля 2009

Вы упоминаете командный файл, что, вероятно, означает, что вы работаете в Windows (я предполагаю, что вы ссылаетесь на файл .bat). Если вы работаете в Unix-системе, попробуйте:

find . -mindepth 2 -type f -exec sh -c "mv {} \`dirname {}\`/\`dirname {} | sed 's/^\.//' | sed 's/\///g'\`\`basename {}\`" \;

В качестве альтернативы, эта программа на Python 3 может добиться цели (также должна работать в Windows ...):

#!/usr/bin/env python3.0

import os
import sys 

def raise_error(e):
    raise e

def full_split(path):
    head, tail = os.path.split(path)

    if head:
        return full_split(head) + [tail]

    return [tail]

def main(args):
    if len(args) != 1:
         print("Please specify one target directory", file=sys.stderr)
         sys.exit(1)

    os.chdir(args[0])
    for dirpath, _, filenames in os.walk('.', onerror=raise_error):
        for f in filenames:
            old = os.path.join(dirpath, f)
            new = os.path.join(dirpath, ''.join(full_split(dirpath[2:]) + [f]))
            os.rename(old, new)

if __name__ == '__main__':
    main(sys.argv[1:])

Макет каталога перед:

.:
Abc  Def

./Abc:
Foo2.bar  Foo.bar

./Def:
Baz2.quux  Baz.quux  Ghi

./Def/Ghi:
Bar2.foo  Bar.foo

Макет каталога после:

.:
Abc  Def

./Abc:
AbcFoo2.bar  AbcFoo.bar

./Def:
DefBaz2.quux  DefBaz.quux  Ghi

./Def/Ghi:
DefGhiBar2.foo  DefGhiBar.foo
1 голос
/ 06 апреля 2009

Лучший пакетный переименователь - mmv .

А также см. Как сделать массовое переименование?

0 голосов
/ 09 апреля 2009

Довольно тривиально в Perl с использованием File :: Find и File :: Copy

0 голосов
/ 09 апреля 2009

Вы можете добиться таких переименований, используя вложенный цикл for в командной строке ... хотя и немного некрасиво:

for /D %d in (*) do for %f in ("%d\*.*") do move "%f" "%d\%~nd%~nf"

Если вы хотите поместить вышеупомянутую команду в пакетный скрипт, повторяйте каждый% символов один раз.

for /D %%d in (*) do for %%f in ("%%d\*.*") do move "%%f" "%%d\%%~nd%%~nf"

Чтобы понять, что делает вышеуказанная команда, обратитесь к FOR /? в командной строке.

Я чувствую, что Пакет настолько тайный в наши дни, мне нужно как-то сохранить мудрость НИМ ...: -)

Я шучу :-) .. но команда работает, я попробовал.

0 голосов
/ 05 апреля 2009

Вы можете попробовать ввести имя пакета: http://batchrename.foryoursoft.com/

...