Como copiar o diretório e as subpastas, mas ignorar certos arquivos na subpasta?

4

Acredito que a pergunta seja feita com um exemplo.

/home
   test1.txt
   test2.txt
   /home/my-folder
      test3.txt
      test4.txt
  1. As pastas test1.txt , test2.txt e my-folder estão dentro de /home .
  2. test3.txt e text4.txt estão dentro de /home/my-folder .

Eu quero copiar todo o conteúdo da pasta /home , mas excluir os 2 arquivos ( test3.txt e test4.txt ) dentro de my-folder .

Como posso fazer isso usando cp ?

Eu sei que é possível com rsync como eu tentei, mas há momentos em que rsync não está instalado em um servidor e eu não tenho direitos para instalar software.

    
por mrjayviper 28.06.2015 / 18:02

3 respostas

6

Você pode fazer isso com find(1) e cpio(1) :

find /home -path './my-folder/test[34].txt' -prune -o \( -type f -print \) | \
    cpio -pdamv /some/other/dir
    
por 28.06.2015 / 18:45
4

Você não pode fazer isso com cp sozinho, resumindo f os arquivos a serem copiados. Fazer cópias parciais vai além das capacidades do cp.

O rsync é a ferramenta óbvia para o trabalho e é muito difundido.

Se você tiver apenas ferramentas POSIX, use pax . Você pode omitir arquivos reescrevendo o caminho deles para uma string vazia.

cd /home && pax -rw -pe -s'~^\./my-folder/test[34]\.txt$~~' . /path/to/destination

Se você tiver apenas um servidor Linux mínimo sem pax, veja se seus equivalentes tradicionais cpio ou tar estão disponíveis. Veja a resposta do lcd047 para um exemplo de cpio. Com o tar GNU, você pode fazer

mkdir /path/to/destination
tar c -C /home --exclude='./my-folder/test[34].txt' | tar x -C /path/to/destination
    
por 29.06.2015 / 01:13
-1

Que tal

cp !(my-folder) /foo

Exemplo:

$ find . -type f
./my-folder/test4.txt
./my-folder/test3.txt
./test2.txt
./test1.txt
$ echo cp !(my-folder) /foo
cp test1.txt test2.txt /foo
$
    
por 28.06.2015 / 20:33