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
$