Como eu excluo uma extensão específica da cópia de arquivos recursiva?

5

Eu quero copiar todos os arquivos e subdiretórios, exceto o arquivo de dados que nomeou * .data para um diretório de destino.

 [ichen@ui01 sub_test]$ ls
a.cxx  a.data  subdir
[ichen@ui01 sub_test]$ ls subdir/
sub_a.cxx  sub_a.data

Você pode ver, existem 2 arquivos de dados no diretório externo e subdiretório respectivamente. Eu usei este comando:

[ichen@ui01 sub_test]$ cp -r !(*.data) ../destination_dir/

teve como objetivo copiar todos os arquivos, exceto o * .data para o destino, mas não funciona no subdir:

  [ichen@ui01 destination_dir]$ ls
a.cxx  subdir
[ichen@ui01 destination_dir]$ ls subdir/
sub_a.cxx  sub_a.data

Você pode ver acima que este comando apenas funciona no primeiro diretório, como posso fazê-lo funcionar em todos os subdiretórios?

    
por spring cc 24.05.2016 / 05:13

1 resposta

2

Você não especifica em sua pergunta se é um requisito para preservar a estrutura de diretório na cópia ou se você só precisa de uma cópia dos arquivos. Para simplesmente copiar todos os arquivos não nomeados * .data, você pode usar isto:

find . -type f ! -name '*.data' | xargs cp -t ../destination_dir/

Por outro lado, se você quiser preservar a estrutura de diretórios, pode usar algo assim:

for file in 'find . ! -name '*.txt' | sed 's/^.\///''; do if [ -d "./$file" ]; then mkdir -p "../destination_dir/$file"; else cp "./$file" "../destination_dir/$file"; fi; done

Não tenho certeza se existe uma maneira mais simples de fazer isso, mas esse comando faz o seguinte:

Encontre todos os arquivos e pastas no diretório atual ou suas subpastas não correspondem a * .data para cada um:

Teste se o arquivo é um diretório se ele for um diretório correspondente no diretório de destino ou, se for um arquivo, copiá-lo para o destino.

Editar: Adicionando versão do script de shell:

#!/bin/bash

# Disable shell glob expansion within the script
# Required to stop bash from expndinging the glob in 
set -f

for file in 'find . ! -name  | sed 's/^.\///''
  do if [ -d "./$file" ]; then
    mkdir -p "/$file"
  else
    cp "./$file" "/$file"
fi
done
    
por MttJocy 24.05.2016 / 05:43