Переименовать имена каталогов рекурсивно - PullRequest
0 голосов
/ 19 января 2012

Я хотел бы переименовать все каталоги (рекурсивно), изменив все вхождения пробелов на подчеркивания.Например,

До изменения:

product images/
  2010 products/
  2011 products/
  2012 products/
misc images/
nav images/

(и т. Д.)

После изменения:

product_images/
  2010_products/
  2011_products/
  2012_products/
misc_images/
nav_images/

Любая помощь приветствуется.

Ответы [ 5 ]

4 голосов
/ 19 января 2012

Взгляните на fixnames .Вы должны сделать что-то вроде:

fixdirs -x \s -r _ *

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

1 голос
/ 19 января 2012

Используя Perl с модулем File :: Find вы можете реализовать что-то вроде этого:

use File::Find;

my $dirname = "../test/";

finddepth(sub {
  return if /^\.{1,2}$/; # ignore '.' and '..'
  return unless -d $File::Find::name; # check if file is directory
  if (s/\ /_/g) {        # replace spaces in filename with underscores
    my $new_name = $File::Find::dir.'/'.$_; # new filename with path
    if (rename($File::Find::name => $new_name)) {
      printf "Directory '%s' has been renamed to '%s'\n",
             $File::Find::name,
             $new_name;
    } else {
      printf "Can't rename directory '%s' to '%s'. Error[%d]: %s\n",
             $File::Find::name,
             $new_name,
             $!, $!;
    }
  }
}, $dirname);

До:

% tree test 
test
├── test 1
├── test 2
└── test 3
    └── test 3 4

После:

% tree test 
test
├── test_1
├── test_2
└── test_3
    └── test_3_4
1 голос
/ 19 января 2012

Вы можете использовать команду rename:

rename -v 's/ /_/g' * */* */*/* */*/*/*

Если вы используете Red Hat (или дистрибутивы, подобные CentOS ...), то команда rename отличается:

rename -v ' ' _ * */* */*/* */*/*/*

Это также переименует пробелы в именах файлов, а не только в каталоги.Но я думаю, это то, что вы хотите, не так ли?

0 голосов
/ 19 января 2012

Это можно сделать в одну строку:

mv "product images" product_images && for i in product_images/**; do mv "$i" "${i// /_}"; done
0 голосов
/ 19 января 2012

Я немного покопался и нашел этот скрипт.Должен делать то, что нужно, очень хорошо.

http://david.lutolf.net/dt/ulb/fixnames

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...