Eu sou um estudante de ciência da computação. Segundo ano de escola - e estou aprendendo sobre Linux. Por causa do vírus Corona, estudo de forma independente. Durante meus estudos me deparei com uma questão com várias seções - não consigo resolver.
A questão quer que eu execute o mv
comando - que transfira alguns arquivos para a pasta. Tentei executar o mv
comando - e tentei integrar "pipe" ou outros comandos como find
.
Esse não é um mv
comando normal na minha opinião, mais coisas precisam ser integradas, como não consigo decifrar. Tentei resolver a questão por alguns dias. Também tentei encontrar perguntas idênticas no fórum - mas não consegui encontrá-las.
A questão:
- Escreva um comando que copiará todos os arquivos que terminam na pasta
.c
ou.h
dentro delaPrograms
.
Minha tentativa foi talvez fazer isso:
find "*.c" -o "*.h" | mv Programs
Responder1
A tarefa pode ser interpretada de três maneiras:
- Copie tudo
.c
e.h
arquivosdo diretório atualpara o diretórioPrograms
ou - Copie tudo
.c
e.h
arquivosdo diretório atual ou em qualquer lugar abaixo delepara o diretórioPrograms
. - Copie todos os acessíveis
.c
e.h
de qualquer lugar do sistemapara o diretórioPrograms
.
Observe que a tarefa diz "copiar" e não "mover". Isso significa que você deve usar o cp
comando, não mv
.
A primeira interpretação da tarefa é resolvida por
cp *.[ch] Programs
(supondo que *.[ch]
corresponda a todos os arquivos nos quais estamos interessados e que não haja muitos milhares deles no diretório atual).
A segunda interpretação da tarefa é resolvida por
find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
Isso procura todos os arquivos regulares com um sufixo de nome de arquivo .c
ou .h
no diretório atual ou abaixo dele e executa cp
para cada um desses arquivos. Não podemos canalizar, cp
pois esse utilitário não lê seu fluxo de entrada padrão.
Também nos certificamos deevitarolhando dentro do Programs
diretório (assumido como um subdiretório no diretório atual). Não fazer isso acabaria copiando arquivos Programs
para Programs
. Ver "Explique as opções -path e -prune do find" para mais informações sobre -path
e -prune
.
A terceira interpretação é fácil de implementar a partir da segunda:
find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
... só precisamos find
começar no topo da árvore de diretórios e especificar que o Programs
diretório a ser evitado é aquele que está no caminho $PWD/Programs
.
Isso provavelmente causará uma série de erros em você porque você não tem acesso a todos os lugares. Para evitar isso, remova também os diretórios que você não pode acessar e copie apenas os arquivos que você pode ler:
find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
-type f -name '*.[ch]' -readable -exec cp {} Programs \;
Isso requer GNU find
para o -executable
teste (um diretório pode ser pesquisado se for executável) e o -readable
teste.
Observe que as find
variações aqui restringirão os arquivos apenas a arquivos regulares (por meio do -type f
teste), enquanto a cp *.[ch]
abordagem copiaria qualquer tipo de coisa que termine nesses dois caracteres. Além disso, a find
solução copiaria arquivos ocultos (arquivos com nomes que começam com um ponto), enquanto a primeira solução não corresponderia a esses tipos de nomes por padrão.