Как переименовать файлы в подкаталогах?

Есть ли способ пакетного переименования файлов в подкаталогах?

Например:

Переименуйте *.html в *.htm в папке, в которой есть каталоги и подкаталоги.


person Shoban    schedule 29.10.2008    source источник
comment
Под партией вы имеете в виду партию за раз или в виде .bat/.cmd/.sh? Первое — это не вопрос программирования, и в Windows для этого есть множество бесплатных утилит. Последние требуют большей точности, по крайней мере, на какую ОС вы ориентируетесь.   -  person PhiLho    schedule 29.10.2008


Ответы (8)


Командная строка Windows: (если внутри пакетного файла, измените %x на %%x)

for /r %x in (*.html) do ren "%x" *.htm

Это также работает для переименования середины файлов

for /r %x in (website*.html) do ren "%x" site*.htm
person Anonymous    schedule 29.10.2008
comment
Примечательно, что это также работает для переименования только средней части файла. Итак, если все ваши файлы начинаются с веб-сайта... и заканчиваются на .html, и вы хотите переименовать их, чтобы они начинались с сайта, а также изменить расширение, вы можете сделать: for /r %x in (website*.html) do ren "%x" site*.htm - person jonnybot; 30.10.2013
comment
Рейвен, попробуй заключить каталоги в двойные кавычки. Это должно решить вашу проблему. Экранирующие пробелы в Linux с обратной косой чертой для исправления такой ситуации, и я думаю, что в Windows тоже есть что-то подобное, но я не могу точно сказать, какой символ. - person 猫IT; 24.07.2018
comment
Мне нужно удалить расширение .$$$ из файлов, просто я пишу для /r %x in (*.$$$) do ren %x *. - person Faraz Ahmed; 27.01.2020

В питоне

import os

target_dir = "."

for path, dirs, files in os.walk(target_dir):
    for file in files:
        filename, ext = os.path.splitext(file)
        new_file = filename + ".htm"

        if ext == '.html':
            old_filepath = os.path.join(path, file)
            new_filepath = os.path.join(path, new_file)
            os.rename(old_filepath, new_filepath)
person monkut    schedule 29.10.2008

В Bash вы можете сделать следующее:

for x in $(find . -name \*.html); do
  mv $x $(echo "$x" | sed 's/\.html$/.htm/')
done
person Adam Rosenfield    schedule 29.10.2008

Я уверен, что есть более элегантный способ, но вот первое, что пришло мне в голову:

for f in $(find . -type f -name '*.html'); do 
    mv $f $(echo "$f" | sed 's/html$/htm/')
done
person albertb    schedule 29.10.2008

Если у вас есть файлы forfiles (я думаю, они поставляются с Windows XP и 2003 и более новыми вещами), вы можете запустить:

forfiles /S /M *.HTM /C "cmd /c ren @file *.HTML"
person BBX    schedule 23.11.2009
comment
Вот еще примеры с файлами forfile: windows-commandline.com/rename-file- расширения — масса - person John Gilmer; 10.03.2017

В Linux вы можете использовать команду 'rename для пакетного переименования файлов.

person ayaz    schedule 29.10.2008

AWK в Linux. Для первого каталога это ваш ответ ... Экстраполируйте, рекурсивно вызывая awk на dir_path, возможно, написав другой awk, который записывает этот точный awk ниже ... и так далее.

ls dir_path/. | awk -F"." '{print "mv file_name/"$0" dir_path/"$1".new_extension"}' |csh
person Alex    schedule 29.10.2008

В Unix вы можете использовать rnm:

rnm -rs '/\.html$/.htm/' -fo -dp -1 *

Or

rnm -ns '/n/.htm' -ss '\.html$' -fo -dp -1 *

Объяснение:

  1. -ns : строка имени (новое имя). /n/ — это правило строки имени, которое заменяется на имя файла без расширения.
  2. -ss : строка поиска (регулярное выражение). Ищет файлы с совпадением.
  3. -rs : заменить строку вида /search_regex/replace_part/modifier
  4. -fo : только файловый режим
  5. -dp : глубина каталога (-1 означает неограниченный).
person Jahid    schedule 07.05.2016