Как я могу пакетно переименовывать файлы?
Вопрос
Я ищу скрипт (подойдет Perl, Python или batch), который будет проходить через указанное файловое дерево и переименовывать все дочерние файлы.
Например, Folder1>File1.anytype
становится Folder1>Folder1File1.anytype
.
Спасибо
Решение
Вы упоминаете командный файл, что, вероятно, означает, что вы работаете в 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
Другие советы
Лучший пакетный переименователь - это ммв.
И смотрите также Как сделать массовое переименование?
вы могли бы попробовать batchrename: http://batchrename .foryoursoft.com/
Вы можете добиться таких переименований, используя вложенный цикл 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 /?
в командной строке.
Я чувствую, что Batch в наши дни настолько загадочен, что мне нужно как-то сохранить мудрость BAT...:-)
Я шучу :-)..но команда действительно работает, я ее пробовал.
Довольно тривиально в Perl с использованием Файл::Найти и Файл::Копировать