Lista de argumentos muito longa ao copiar arquivos

15

Acabei de fazer uma pergunta relacionada a como posso contar os arquivos de uma determinada extensão. Agora quero cp desses arquivos para um novo dir .

Estou tentando,

cp *.prj ../prjshp/

e

cp * | grep '\.prj$' ../prjshp/

mas eles estão dando o mesmo erro,

  

bash: / bin / cp: lista de argumentos muito longa

Como posso copiá-los?

    
por Sam007 15.11.2012 / 22:16

3 respostas

21

cp *.prj ../prjshp/ é o comando certo, mas você atingiu um caso raro em que ele atinge uma limitação de tamanho. O segundo comando que você tentou não faz nenhum sentido.

Um método é executar cp nos arquivos em partes. O comando find sabe como fazer isso:

find -maxdepth 1 -name '*.prj' -exec mv -t ../prjshp {} +
  • find atravessa o diretório atual e os diretórios abaixo dele recursivamente.
  • -maxdepth 1 significa parar em uma profundidade de 1, ou seja, não recorrer a subdiretórios.
  • -name '*.prj' significa agir apenas nos arquivos cujo nome corresponde ao padrão especificado. Observe as aspas ao redor do padrão: ele será interpretado pelo comando find , não pelo shell.
  • -exec … {} + significa executar o comando especificado para todos os arquivos. Invoca o comando várias vezes, se necessário, tendo o cuidado de não exceder o limite da linha de comandos.
  • mv -t ../prjshp move os arquivos especificados para ../prjshp . A opção -t é usada aqui devido a uma limitação do comando find : os arquivos encontrados (simbolizados por {} ) são passados como o último argumento do comando, você não pode adicionar o destino após ele. / li>

Outro método é usar rsync .

rsync -r --include='*.prj' --exclude='*' . ../prjshp
  • rsync -r … . ../prjshp copia o diretório atual para ../prjshp recursivamente.
  • --include='*.prj' --exclude='*' significa copiar arquivos que correspondem a *.prj e excluir todo o resto (incluindo os subdiretórios, portanto, .prj arquivos nos subdiretórios não serão encontrados).
por Gilles 15.11.2012 / 22:31
8

Este comando copia os arquivos um a um e funcionará mesmo se houver muitos deles para * para expandir em um único comando cp :

for i in *; do cp "$i" ../prjshp/; done
    
por ccshields 24.08.2017 / 22:39
1

IMHO, as ferramentas ideais para lidar com hordas de arquivos são find e xargs . Veja man find . Veja man xargs . find , com sua opção -print0 , produz uma lista de nomes de arquivos NUL (nomes de arquivos podem conter qualquer caractere execpt NUL ou / ) que xargs entenda, usando a opção -0 . xargs , em seguida, constrói o comando mais longo permitido (a maioria dos nomes de arquivos, sem metade do nome do arquivo no final) e o executa. xargs repete isso até find não fornecer mais nomes de arquivos. Execute xargs --show-limits </dev/null para ver os limites.

Para resolver seu problema, (e depois de verificar man cp para encontrar --target-directory= ):

find . -maxdepth 1 -type f -name '*.prj' -print0 | xargs -0 cp --target-directory=../prjshp/
    
por waltinator 25.08.2017 / 00:01