Copie os arquivos para uma pasta de destino somente se os arquivos já existirem. mas os arquivos de origem têm uma extensão de arquivo diferente

2

Copie os arquivos para uma pasta de destino somente se os arquivos já existirem. mas os arquivos de origem têm uma extensão de arquivo diferente.

ou seja Eu tenho um backup de alguns arquivos com extensão " .desktop.in " e eu quero copiar para o destino onde as extensões de arquivos são " .desktop " e apenas os arquivos que já existem no destino.

pasta de origem contém:

  • a.desktop.in
  • b.desktop.in
  • c.desktop.in
A pasta de destino

contém:

  • a.desktop
  • b.desktop

Deseja apenas substituir arquivos a.desktop e b.desktop

Tentei isto:

for file in /destination/*.desktop;do cp /src/"${file##*/}".in "$file";done

Mas isso não parece otimizado para essa tarefa.

Você conhece uma maneira melhor de fazer isso?

    
por Paul 04.03.2015 / 05:31

3 respostas

0

Encontrados de duas maneiras:

for file in /src/*.desktop.in; do
  file=${file%.in}
  if test -e "/dest/$(basename ${file})"
    then cp "/src/${file}.in" "/dest/${file}"
  fi
done

rsync e --existindo:

for file in /src/*.desktop.in; do 
  rsync --dry-run --existing --verbose "/src/${file}" "/dest/${file%.in}"
done
    
por 06.03.2015 / 11:22
1
for file in /destination/*.desktop; do echo cp "/src/${file##*/}.in" "$file"; done

Se tudo estiver correto, remova echo .

    
por 04.03.2015 / 08:01
0

O que você tem é basicamente o melhor possível.

Você pode salvar uma pequena parte da manipulação de nomes de arquivos alterando para o diretório no qual está enumerando os arquivos. É uma questão de legibilidade, não de desempenho.

set -e
cd /destination
for file in *.desktop; do
  cp "/src/$file.in" "$file"
done

Não se esqueça de verificar falhas.

    
por 05.03.2015 / 01:10