Renomeie vários arquivos, subdiretórios e insira caracteres em um local específico no OSX

4

Eu tenho arquivos e diretórios começando com "cateory-icon -" em muitos subdiretórios. Estou tentando renomeá-los recursivamente para "category-icons -" . Observe que adicionei "g" ausente à categoria e "s" ao final de ícones .

Eu olhei para várias outras questões relacionadas a renomeação de vários arquivos e diretórios, mas não consegui fazer com que nenhuma delas funcionasse para mim!

Um pouco de explicação sobre a resposta seria muito apreciada.

EDITED: Aqui está um exemplo da minha estrutura de diretórios:

test/cateory-icon-archery/cateory-icon-archery.png
                          [email protected]

test/cateory-icon-automotive/cateory-icon-automotive.png
                             [email protected]
    
por Yas T. 04.10.2013 / 22:08

3 respostas

3

Como você precisa fazer isso de forma recursiva, find é a melhor ferramenta para usar. Para alterar o nome, você pode usar sh na chamada -exec . Aqui está um exemplo:

find /some/path -name 'cateory-icon' -exec sh -c 'mv "$1" "${1%/*}/category-icon-${1#cateory-icon-*}"' -- {} \;

A expansão ${1#cateory-icon-*} obtém o nome do arquivo depois de cateory-icon .

    
por 04.10.2013 / 23:19
3

Em zsh, coloque o seguinte em seu .zshrc (ou execute-os na linha de comando por uma única vez):

autoload zmv
alias zcp='zmv -C'
alias zln='zmv -L'

A % funçãozmv combinada com zsh's wildcards e recursos globbing permitem fácil renomeação e cópia de arquivos. Aqui estão várias maneiras de fazer o que você quer:

zmv '(**/)cateory-icon-(*)' '${1}category-icons-$2'
zmv -w '**/cateory-icon-*' '${1}category-icons-$2'
zmv '**/cateory-icon-(*)' '$f:h/category-icons-$1'

Explicação de alguns recursos do zsh:

  • **/ corresponde arquivos em subdiretórios de forma recursiva.
  • Os parênteses na expressão de origem designam grupos. $NUM ou ${NUM} na expressão de substituição é substituído pela parte do nome original que contém o NUMth grupo.
  • Os parênteses em torno de ** são um pouco peculiares: você só pode colocá-los em torno de **/ , nem mais nem menos.
  • A opção -w para zmv coloca automaticamente cada caractere curinga em um grupo (para ** , é a parte **/ que está em um grupo, com o / à direita).
  • $f na substituição significa todo o nome do arquivo de origem.
  • $VAR:h significa a parte do diretório de $VAR . Isso geralmente é de $VAR até o último / , mas todos os casos de borda ( foo , foo/ , / ,…) são tratados corretamente. O nome base está disponível como $VAR:t .
por 05.10.2013 / 04:57
0

Usando o Perl para portabilidade máxima:

#!/usr/bin/env perl

use strict;
use warnings;
use File::Find;
use File::Copy qw(move);

my $new_name;
finddepth( sub { 
                 if(/cateory-icon/){
                     ($new_name = $File::Find::name) =~ s{.*/\Kcateory-icon}{category-icons};
                     move $File::Find::name => $new_name;
                 }
           },
          '.')

Explicação

  • Isso faz uso de dois módulos principais Perl: File::Find para percurso recursivo de árvores de diretório e File::Copy para cópia recursiva / movimentação de diretórios.
  • A função finddepth (de File::Find ) percorre a lista de diretórios fornecida como seu segundo argumento ( . neste caso é o diretório atual; modifique conforme necessário).
  • O primeiro argumento para finddepth é uma referência de sub-rotina que é executada para cada arquivo que finddepth encontra enquanto percorre a árvore.
  • Desativamos essa sub-rotina por uma condição if : se o nome do arquivo correspondente tiver o padrão cateory-icon , então formaremos o novo nome fazendo as correções necessárias e usaremos o move função (de File::Copy ) para modificar o nome atual para o novo nome.

Aviso de isenção

Este código não foi testado. Experimente em uma árvore de diretórios fictícia primeiro!

    
por 04.10.2013 / 23:42