Como faço para passar um programa de linha de comando uma lista de arquivos de um diretório?

4

Estou tentando fazer o upload de documentos para minha conta Microsoft OneDrive usando python-onedrive . O comando que estou usando é este:

onedrive-cli put Long\ Filename\ 1.jpg
onedrive-cli put Long\ Filename\ 2.jpg

O problema é que há muitos desses arquivos, e eu quero fazer o upload de todos eles (não há opção para carregar um diretório inteiro). Eu tenho usado o asterisco, mas isso não funciona:

user@office-debian:~/Desktop/docs$ onedrive-cli put *
usage: onedrive-cli [-h] [-c path] [-p] [-i] [-e enc] [--debug]

                    {auth,quota,recent,info,info_set,link,ls,mkdir,get,put,cp,mv,rm,comments,comment_add,comment_delete,tree}
                    ...
onedrive-cli: error: unrecognized arguments: Long Filename 1.jpg Long Filename 2.jpg

Eu presumo que isso seja porque o programa espera que os espaços sejam escapados, mas o asterisco não os expande dessa maneira. Eu tentei "piping" os argumentos sem sucesso:

user@office-debian:~/Desktop/docs$ ls | onedrive-cli put
usage: onedrive-cli put [-h] [-n] file [folder]
onedrive-cli put: error: too few arguments

Evidentemente, onedrive-cli não reconhece STDIN . Existem outras opções simples? Eu percebi que eu provavelmente poderia escrever um roteiro, mas eu realmente esperava evitar isso!

O seguinte parece funcionar, mas não é exatamente o que eu tinha em mente:

for files in * ; do
  onedrive-cli put "$files"
done
    
por quant 09.06.2014 / 07:42

4 respostas

0

Se o seguinte não funcionar ...

cd ./target_dir
    set -- *
    onedrive-cli put "$@"

Então provavelmente é porque você precisa de um put para cada argumento e, nesse caso, isso pode:

{    printf 'one-drive-cli' 
     printf " put ///%s///" *
} | sed 's|'\''|&"&"&|g;s|///|'\''|g' |
. /dev/stdin 

Mas se isso não funcionar, o seu for loop provavelmente é a melhor solução shell porque seu script python suportará apenas um upload por chamada.

A melhor maneira de fazer isso é editar o script python para atender às suas necessidades.

    
por 09.06.2014 / 08:59
1
usage: onedrive-cli put [-h] [-n] file [folder]

Isso indica que o subcomando put do programa onedrive-cli deve ter um ou dois argumentos não opcionais. Um arquivo é obrigatório (o nome do arquivo local para upload) e uma pasta é opcional (uma pasta remota para fazer o upload).

O comando onedrive-cli put * passa os nomes de todos os arquivos no diretório atual como argumentos. Ele funciona, não importa quais caracteres estranhos os nomes de arquivo possam conter. O problema é que o programa onedrive-cli não aceita vários arquivos como argumentos, ao contrário de muitos comandos de manipulação de arquivos.

O loop é o jeito certo de fazer isso:

for file in * ; do
  onedrive-cli put "$file"
done

O loop pode ser lento se o comando tiver que se autenticar no servidor novamente para cada arquivo. Não parece haver uma maneira de fazer melhor com a ferramenta onedrive-cli-tool, conforme previsto. Você poderia escrever algumas linhas de Python (aviso: completamente não testado! Em particular, eu não sei como os erros serão sinalizados.)

#!/usr/bin/env python
import sys
from onedrive import api_v5
api = api_v5.PersistentOneDriveAPI.from_conf({})
for f in sys.argv[1:]:
    api.put(f)

¹ Exceção: por razões históricas, * omite arquivos cujo nome começa com . (arquivos de pontos).

    
por 10.06.2014 / 02:59
1

Pode ser mais fácil apenas clicar com o link.

find ~/Desktop/docs -type f -exec overdrive-cli put {} \;

exec irá pegar cada alça de arquivo e alimentá-la no comando listado. O {} denota o nome do arquivo e o \; especifica o final do exec. Assim, você pode até usar o seguinte se quiser ter certeza de que cada arquivo seja carregado apenas uma vez.

find ~/Desktop/docs -type f -exec overdrive-cli put {}; mv {} ~/Desktop/old-docs \;

O {} pode precisar de aspas duplas para lidar com espaços, mas não é provável.

    
por 10.06.2014 / 03:21
0

Faça uma lista de endereços de arquivos que você deseja enviar.Tenha certeza de que nenhum deles tem espaços. então escreva

import os
#files is the list of addresses
for address in files:
    os.system("onedrive-cli put " + address)
    
por 12.05.2015 / 07:59