Пакетное переименование файлов, включая подкаталоги

Я переименовываю пустые расширения файлов с помощью этой команды:

rename *. *.bla

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

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

Ответ 2

for /r c:\path\ %G in (*.) do ren "%G" *.bla

Ответ 3

Вы можете легко сделать это и многое другое с помощью модуля Perl File:: Find.

#!perl

use strict;
use warnings;
use File::Find;

my $extension = 'bla';
my $directory = '/tmp/test';

print "Files renamed:\n";
find( \&wanted, $directory );

sub wanted {
    return if /\./;
    return unless -f $File::Find::name;

    if ( rename( $File::Find::name, "$File::Find::name.$extension" ) ) {
        print "    $File::Find::name -> $File::Find::name.$extension\n";
    }
    else {
        print "    Error: $! - $File::Find::name\n";
    }
}

Ответ 4

это позволит вам вводить dirs с пробелами в именах. (обратите внимание, что double% для пакетных файлов, используйте один% для командной строки.)

 for /f "tokens=* delims= " %%a in ('dir /b /ad /s') do rename "%%a\*." "*.bla"

Ответ 5

Вы можете использовать for для итерации по подкаталогам:

for /d %x in (*) do pushd %x & ren *. *.bla & popd

При использовании его из пакетного файла вам нужно будет удвоить знаки %:

for /d %%x in (*) do pushd %%x & ren *. *.bla & popd

Ответ 6

Попробуйте это

for /R c:\temp %I in (*. ) DO Echo rename %I "%~nI.bla"

Ответ 7

Использование find и xargs и basename облегчит чтение выражения

Подготовьте оболочку переименования script как это (исправлено для обработки нескольких файлов)

#!/bin/sh
if [ $# -lt 3 ] 
then
    echo "usage: rename.sh sufold sufnew file1 (file2 file3 ...) "
    exit
fi

sufold=$1
sufnew=$2
shift
shift

for f in $*
do
  echo "to mv " $f `dirname $f`"/"`basename $f $sufold`$sufnew
  mv $f `dirname $f`"/"`basename $f $sufold`$sufnew
done

Затем вы можете вызвать это для каждого файла, соответствующего вашим критериям, включая поиск рекурсивных папок командой find

find . -name "*." | xargs rename.sh "." ".bla"

Более распространенный образец

find . -name "*.htm" | xargs rename.sh ".htm" ".html"