Arquivos de cópia recursiva com renomeação

3

Se eu tiver a pasta de entrada files_input que tem subfilders como 01-2015 , 02-2015 , 03-2015 etc e todas essas subpastas tiverem outras subpastas. Cada subpasta tem apenas um arquivo chamado index.html .

Como posso copiar todos esses arquivos index.html em uma pasta chamada files_output , para que eles acabem como arquivos separados na mesma pasta. Eles devem ser renomeados e eu tentei usar - backup para isso ...

Eu tentei

find files_input -name \*.html -exec cp --backup=t '{}' files_output \;

para obtê-los numerados, mas copia apenas um arquivo e nada mais.

Eu não sei se isso muda alguma coisa, mas estou usando o zsh, aqui estão as versões:

   $ zsh --version | head -1
   zsh 5.0.2 (x86_64-pc-linux-gnu)
   $ bash --version | head -1
   GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
   $ cp --version | head -1
   cp (GNU coreutils) 8.21
   $ find --version | head -1
   find (GNU findutils) 4.4.2

Idéias?

Editar:

Tentando executar, por exemplo seguindo

cp --backup=t files_input/01-2015/index.html files_output

cinco vezes seguidas ainda me dá uma index.html na pasta files_output ! Cp está quebrado? Por que não tenho cinco arquivos diferentes?

    
por Perica Zivkovic 02.07.2015 / 23:14

3 respostas

0

Tente remover as aspas em torno de {} , como pareceu funcionar para mim desse jeito.

$ find foo* files_output -ls
 27002    0 drwxrwxr-x   2 steve    steve          60 Jul  2 15:04 foo1
 25373    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:04 foo1/index.html
 27003    0 drwxrwxr-x   2 steve    steve          60 Jul  2 15:04 foo2
 25374    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:04 foo2/index.html
 48941    0 drwxrwxr-x   2 steve    steve          40 Jul  2 15:06 files_output
$ find foo* -name index.html -exec cp --backup=t {} files_output \;
$ find files_output -ls
 48941    0 drwxrwxr-x   2 steve    steve          80 Jul  2 15:08 files_output
 51354    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:08 files_output/index.html
 49595    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:08 files_output/index.html.~1~
$

No meu caso, versões dos utilitários como abaixo.

$ bash --version | head -1
GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu)
$ cp --version | head -1
cp (GNU coreutils) 8.21
$ find --version | head -1
find (GNU findutils) 4.5.11
$
    
por 03.07.2015 / 00:10
0

Você pode fazer assim:

cd -P files_input/.. &&
mkdir files_output   &&
pax -rws'|.*/\(.*\)/\(.*\)|.|' \
     files_input/??-2015/index.html files_output

Quais serão todos os arquivos index.html nas pastas nos diretórios filhos de ./files_input nomeado com dois caracteres, em seguida, um traço e, em seguida, a string 2015 e copie todos esses arquivos para a pasta files_output recém-criada com nomes como ??-2015.index.html .

    
por 05.07.2015 / 21:26
-1

Isso funcionou para mim:

find files_input -name "171123*" -exec cp --backup=t --target-directory=files_output {} +

Copia todos os arquivos que correspondem ao padrão -name em dirs e subdiretórios de "files_input" para o diretório "file_output" e acrescenta ~ 1 ~, ~ 2 ~, etc. para arquivos duplicados.

    
por 30.11.2017 / 02:03