Como executar o comando "mv" com condições - mover arquivos com determinado final para outra pasta

Como executar o comando "mv" com condições - mover arquivos com determinado final para outra pasta

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 mvcomando - que transfira alguns arquivos para a pasta. Tentei executar o mvcomando - e tentei integrar "pipe" ou outros comandos como find.

Esse não é um mvcomando 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:

  1. Escreva um comando que copiará todos os arquivos que terminam na pasta .cou .hdentro dela Programs.

Minha tentativa foi talvez fazer isso:

find "*.c" -o "*.h" | mv Programs

Responder1

A tarefa pode ser interpretada de três maneiras:

  1. Copie tudo .ce .harquivosdo diretório atualpara o diretório Programsou
  2. Copie tudo .ce .harquivosdo diretório atual ou em qualquer lugar abaixo delepara o diretório Programs.
  3. Copie todos os acessíveis .ce.h de qualquer lugar do sistemapara o diretório Programs.

Observe que a tarefa diz "copiar" e não "mover". Isso significa que você deve usar o cpcomando, 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 .cou .hno diretório atual ou abaixo dele e executa cppara cada um desses arquivos. Não podemos canalizar, cppois esse utilitário não lê seu fluxo de entrada padrão.

Também nos certificamos deevitarolhando dentro do Programsdiretório (assumido como um subdiretório no diretório atual). Não fazer isso acabaria copiando arquivos Programspara Programs. Ver "Explique as opções -path e -prune do find" para mais informações sobre -pathe -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 findcomeçar no topo da árvore de diretórios e especificar que o Programsdiretó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 findpara o -executableteste (um diretório pode ser pesquisado se for executável) e o -readableteste.

Observe que as findvariações aqui restringirão os arquivos apenas a arquivos regulares (por meio do -type fteste), enquanto a cp *.[ch]abordagem copiaria qualquer tipo de coisa que termine nesses dois caracteres. Além disso, a findsoluçã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.

informação relacionada