find ./assign/*.c -exec cp ./assign2 {} \;
O curinga ( *
) é expandido pelo shell antes mesmo de ser executado. Digamos que existem dois arquivos, source1.c e source2.c no diretório assign, então o acima é equivalente a
find ./assign/source1.c ./assign/source2.c -exec cp ./assign2 {} \;
Isso é válido por todos os meios e significa que você só quer fazer algo com esses arquivos específicos. Por exemplo, você poderia escrever
find ./assign/*.c -name '*2*'
e o resultado seria aproximadamente equivalente a ls ./assign/*.c | grep 2
ou ls ./assign/*2*.c
.
Observe que, se você não quiser que o shell expanda os curingas, precisará colocá-los entre aspas:
find "./assign/*.c"
No entanto, isso falhará, pois o Find trata o nome do caminho literalmente (sem nenhuma expansão de caractere curinga), então parece literalmente para um arquivo chamado *.c
(sim, que é um nome de arquivo válido) .
Quanto à segunda parte da sua primeira expressão ( exec cp ./assign2 {} \;
). Obviamente, há um erro de digitação, já que o comando cp tenta copiar o diretório assign2 para o segundo argumento. Dado que você tem arquivos source1.c e source2.c no diretório assign, o resultado do seu comando será equivalente a
cp assign2/ ./assign/source1.c
cp assign2/ ./assign/source2.c
O que provavelmente não é o que você pretendia (também falhará, porque você não pode copiar um diretório para um nome de arquivo).
Agora, para a segunda expressão, porque também há um problema aqui:
find ./assign -type f -name *.c -exec cp {} ./assign2 \;
Isso funcionará somente se não houver arquivos com a extensão .c
no diretório atual. Caso contrário, o shell expandirá o *.c
. Diga, você tem os seguintes arquivos:
./master.c
./assign/source1.c
./assign/source2.c
A linha de comando acima será expandida primeiro por shell para
find ./assign -type f -name master.c -exec cp {} ./assign2 \;
Isso falhará, porque não há arquivo master.c no diretório assign /. Em vez disso, use
find ./assign -type f -name "*.c" -exec cp {} ./assign2 \;
Em qualquer caso, a menos que você tenha uma estrutura de diretório complexa em ./assign ou diretórios que terminem em .c
, prefiro apenas
cp ./assign/*.c ./assign2