extrair subpastas externas e renomear, se necessário

0

Eu tenho um diretório parecido com:

dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls
DFT-00001 DFT-00004 DFT-00007 DFT-00010 DFT-00013 DFT-00016 DFT-00019 DFT-00022 DFT-00025 DFT-00028 DFT-00031 DFT-00034
DFT-00002 DFT-00005 DFT-00008 DFT-00011 DFT-00014 DFT-00017 DFT-00020 DFT-00023 DFT-00026 DFT-00029 DFT-00032
DFT-00003 DFT-00006 DFT-00009 DFT-00012 DFT-00015 DFT-00018 DFT-00021 DFT-00024 DFT-00027 DFT-00030 DFT-00033

E dentro de cada pasta existe um arquivo chamado Li? Fe? O? _0, no entanto, alguns deles podem se sobrepor, por exemplo:

dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls DFT-00001/
Li1Fe5O6_0
dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls DFT-00002/
Li1Fe5O6_0
dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls DFT-00010/
Li2Fe4O6_0

Agora, quero extrair a subpasta em outro diretório. A primeira tentativa que tento é:

find 'pwd' -mindepth 1 -maxdepth 1 -type d -exec sh -c "echo {}; cd {}; ls; cp -r * /Users/wenxuanhuang/Desktop/software/CASM_NEW/LiFeO_from_Alex_2015_08_25/LiFeO2-CE/02-refinement/CE-06-new-stuctures_extracted" \;

No entanto, devido a conflitos de nomes, alguns deles se sobrepõem. o que eu quero é: se eles se sobrepuserem: eu quero renomeá-lo em algo que não é conflitante e copiá-lo para dentro ...

Idealmente, suponha que Li1Fe5O6_0 já esteja na nova pasta e eu copie outro Li1Fe5O6_0, eu gostaria de nomear o último Li1Fe5O6_0 para Li1Fe5O6_1 e copiar o Li1Fe5O6_1 para dentro (no futuro, podemos ter Li1Fe5O6_1 Li1Fe5O6_2 Li1Fe5O6_3 etc) Mas se esta versão do código é muito tediosa. Então não importa ...

    
por user40780 31.08.2015 / 19:40

1 resposta

1

Isso deve ser feito:

#!/bin/bash

# this is the crucial setting: replace a glob pattern that matches zero files
# with nothing (the default is to *not* replace the pattern at all)
shopt -s nullglob

destination=/some/directory

unique_filename() {
    local root=${1%_*}_
    local files=( "$destination/$root"* )
    echo "$destination/${root}${#files}"
}

cd /wherever/you/need/to/go

for f in */Li?Fe?O?_0; do
    echo mv "$f" "$(unique_filename "$(basename "$f")")"
done

Funciona contando o número de arquivos no diretório de destino correspondente, por exemplo, "Li1Fe5O6_ *". Se não houver nenhum, use "Li1Fe5O6_0". Se "Li1Fe5O6_0" já estiver presente, a matriz $files terá um elemento, então o nome de arquivo exclusivo será "Li1Fe5O6_1"

    
por 31.08.2015 / 19:58