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
Acredito que a pergunta seja feita com um exemplo.
/home
test1.txt
test2.txt
/home/my-folder
test3.txt
test4.txt
test1.txt
, test2.txt
e my-folder
estão dentro de /home
. 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.
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
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
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
$