DEV Community

Cover image for Copie arquivos via linha de comando com C++
Marcos Oliveira
Marcos Oliveira

Posted on • Edited on

Copie arquivos via linha de comando com C++

🕸️ Seu comando customizado, simples e rápido!


Que tal a comodidade de copiar os arquivos via linha de comando? Basta, vocĂŞ criar seu prĂłprio comando rapidamente com C++.

Veja abaixo o passo a passo!


DependĂŞncias

Exemplo em distros que usam o APT como gerenciador de pacotes

Procure nomes correspondentes para a sua distro.

sudo apt install build-essential libx11-dev libxcb1-dev libpng-dev
Enter fullscreen mode Exit fullscreen mode

E compile e instale também o clip

git clone https://github.com/dacap/clip
cd clip
cmake . -B build
cmake --build build
sudo cmake --install build
Enter fullscreen mode Exit fullscreen mode

Crie o CĂłdigo

Exemplo: main.cpp

#include <clip.h>
#include <fstream>
#include <iostream>
#include <sstream>
#include <memory>

const auto use = [](){
  std::cerr << "Use: xclip++ <file> [file...]\n";
};

class Xclip {
  public:
    Xclip(int argc, char** argv){
      std::ostringstream buffer;

      for (int i = 1; i < argc; ++i) {
        std::ifstream file(argv[i], std::ios::binary);
        if (!file) {
          std::cerr << "Error opening: " << argv[i] << "\n";
          std::exit(1);
        }

        buffer << file.rdbuf();

        if(i + 1 < argc){
          buffer << '\n';
        }
      }

      clip::set_text(buffer.str());
    }
};

int main(int argc, char** argv){
  if(argc < 2){
    use();
    return 1;
  }

  auto xclip = std::make_unique<Xclip>(argc, argv);
}
Enter fullscreen mode Exit fullscreen mode

Compile e Instale

g++ main.cpp -o xclip++ -lclip -lxcb -lX11 -lpng -pthread
sudo install -v xclip++ /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

Use facilmente

xclip++ file.txt
# Ou vários arquivos
xclip++ file1.txt file2.md file3.cpp # ...
Enter fullscreen mode Exit fullscreen mode

Atualização e correção

Se vc notar, ao tentar usar o pipe(|) nĂŁo funciona, exemplos:

cat file.txt | xclip++
echo 'Lorem Ipsum' | xclip++
Enter fullscreen mode Exit fullscreen mode

Pra resolver isso adicionei:

  • <unistd.h>
  • Sobre carreguei o construtor: Xclip(const std::string& content) para clip::set_text(content);
  • E finalmente adicionei o setvbuf(stdout, NULL, _IONBF, 0);

CĂłdigo pronto para o uso com pipe:

#include <clip.h>
#include <fstream>
#include <iostream>
#include <sstream>
#include <memory>
#include <unistd.h>

const auto use = [](){
  std::cerr << "Use: xclip++ <file> [file...]\n";
};

class Xclip {
  public:
    Xclip(int argc, char** argv){
      std::ostringstream buffer;

      for(int i = 1; i < argc; ++i){
        std::ifstream file(argv[i], std::ios::binary);
        if(!file){
          std::cerr << "Error opening: " << argv[i] << "\n";
          std::exit(1);
        }

        buffer << file.rdbuf();

        if(i + 1 < argc){
          buffer << '\n';
        }
      }

      clip::set_text(buffer.str());
    }

    Xclip(const std::string& content){
      clip::set_text(content);
    }
};

int main(int argc, char** argv){
  setvbuf(stdout, NULL, _IONBF, 0);

  bool has_pipe = !isatty(STDIN_FILENO);

  if(has_pipe){
    std::ostringstream ss;
    ss << std::cin.rdbuf();
    std::string input = ss.str();

    Xclip xclip(input);
  }else if (argc > 1){
    Xclip xclip(argc, argv);
  }else{
    use();
    return 1;
  }

  return 0;
}
Enter fullscreen mode Exit fullscreen mode

Compile e instale:

g++ main.cpp -o xclip++ -lclip -lxcb -lX11 -lpng -pthread
sudo install -v xclip++ /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

Se quise o nome do comando de forma mais resumida, rode também:

mv xclip++ xclip
sudo install -v xclip /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

Agora basta usar o comando xclip, exemplos:

# Ăšnico arquivo:
xclip++ file.txt

# Vários arquivos:
xclip++ file1.txt file2.md file3.cpp # ...

# Via pipe:
echo 'My test' | xclip
cat file.txt | xclip
Enter fullscreen mode Exit fullscreen mode

Veja também: Copie e cole via linha de comando do Linux com xclip

Aprenda C++

https://terminalroot.com.br/cpp

Top comments (0)