Alguém pode me explicar o comportamento do comando de localização que eu uso?

1

Alguém pode me dizer por que o seguinte comando não será executado:

find ./assign/*.c -exec cp ./assign2 {} \;

e qual é a diferença quando eu faço o seguinte (que realmente é executado):

find ./assign -type f -name *.c  -exec cp {} ./assign2 \;
    
por Brut3e 05.09.2012 / 08:17

2 respostas

3

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
    
por January 05.09.2012 / 09:38
2

Para "encontrar", você precisa especificar, na ordem:

  • onde procurar (./assign)
  • tipo de documento (-tipo f arquivo aka), mas isso é opcional
  • nome do documento (-nome * .c, também conhecido como arquivo com extensão = .c), e isso não é opcional

Então, você está dizendo "find" que, após a busca, ele tem que executar um comando específico (-exec) e a sintaxe para "cp" está correta em ambos os comandos que você está emitindo, mas desde a sintaxe para "find "no primeiro está incorreto, o primeiro não será executado.

BTW, eu não acho que, depois de encontrar todos os arquivos .c, faça algum sentido copiar o diretório ./assign2 para a descoberta real ({}), mas sim o contrário. Ou seja, IMHO, que mesmo que a sintaxe esteja correta, o comando "cp" na primeira linha não faz nada.

    
por A S 05.09.2012 / 09:00