Copie somente arquivos regulares de um diretório para outro

9

Eu gostaria de copiar um conteúdo do diretório 1 para o diretório 2. No entanto, gostaria de copiar apenas arquivos (e não diretórios) do meu diretório 1. Como posso fazer isso?

cp dir1/* dir2/*

então ainda tenho o problema dos diretórios.

Além disso, todos os meus arquivos não têm nenhuma extensão, então . não fará o truque

    
por user1058398 20.11.2013 / 13:38

3 respostas

12
cp dir1/* dir2

cp não copiará os diretórios, a menos que seja explicitamente solicitado (com --recursive , por exemplo, consulte man cp ).

Observação 1: cp provavelmente sairá com um status diferente de zero, mas os arquivos serão copiados de qualquer maneira. Isso pode ser um problema ao encadear comandos com base em códigos de saída: && , || , if cp -r dir1/* dir2; then ... etc. (graças a contrebis para comentário deles sobre essa questão )

Observação 2 : cp espera que o último parâmetro seja um único nome de arquivo ou diretório. Não deve haver nenhum caractere curinga * após o nome do diretório de destino. dir2\* será expandido pelo shell como dir1\* . Coisas inesperadas ocorrerão :

  • Se dir2 estiver vazio e dependendo do seu shell e configurações:
    • você pode receber uma mensagem de erro, que é o melhor cenário possível.
    • dir2/* será obtido literalmente (procurando por um arquivo / diretório denominado * ), o que provavelmente levará a um erro também, a menos que * realmente exista.
    • dir2/* será apenas removido do comando inteiramente, deixando cp dir1/* . Que, dependendo da expansão de dir1/* , pode até destruir dados:
      • Se dir1/* corresponder a apenas um arquivo ou diretório, você receberá um erro de cp .
      • Se dir1/* corresponder exatamente a dois arquivos, um será substituído pelo outro ( Bad ).
      • Se dir/* corresponder a vários arquivos e a última correspondência for a, você receberá uma mensagem de erro.
      • Se a última correspondência de dir/* for um diretório, todas as outras correspondências serão movidas para ele.
  • Se dir2 não estiver vazio, depende novamente:
    • Se a última correspondência de dir2/* for um diretório, dir1/* e as outras correspondências de dir2/* serão movidas para.
    • Se a última correspondência de dir2/* for um arquivo, você provavelmente receberá uma mensagem de erro, a menos que dir1/* corresponda apenas a um arquivo.
por 20.11.2013 / 13:58
6

É o shell que expande curingas, não os comandos. Portanto, cp dir1/* dir2/* primeiro expande os dois curingas e, em seguida, chama cp no resultado. Isso não é nada do que você espera: dependendo de quantos arquivos já existem em dir2 , dir2/* pode se expandir para um ou mais argumentos. O comando cp não sabe quais de seus argumentos vieram da expansão do primeiro padrão e quais vieram da expansão do segundo padrão. Ele espera que seu último argumento seja o nome do diretório de destino. Assim, para copiar todos os arquivos do diretório dir1 para o diretório dir2 , o último argumento deve ser o diretório dir2 :

cp dir1/* dir2

Como * corresponde a todos os arquivos, cp tenta copiar todos os arquivos. Isso inclui diretórios: diretórios são arquivos também. Ele ignora diretórios, mas relata um erro. Ele copia o conteúdo de arquivos especiais, como pipes nomeados (algo deve ser escrito para eles, ou cp irá bloquear), etc.

Para copiar apenas arquivos regulares , você precisa restringir a correspondência. Em zsh, você pode usar o qualificador de glob . para isso:

cp dir1/*(.) dir2

Outras granadas não têm isso. Você pode usar o comando find para filtrar os tipos de arquivo. Supondo que você esteja executando o Linux ou o Cygwin não embarcado:

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

No Linux, FreeBSD e OSX:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2
    
por 21.11.2013 / 02:24
0

Abaixo está o comando para copiar o arquivo da origem para o diretório de destino.

  1. Vá para a pasta de origem e escreva abaixo o comando:

    $ cp fileName destination directory path

Exemplo:

cp publichOT.sh  /data/home/useradmin
    
por 05.01.2016 / 07:42

Tags