我正在尝试Microsoft OneDrive
使用 将文档上传到我的帐户python-onedrive
。我正在使用的命令是这样的:
onedrive-cli put Long\ Filename\ 1.jpg
onedrive-cli put Long\ Filename\ 2.jpg
问题是这些文件有很多,我想上传所有这些文件(没有上传整个目录的选项)。我使用了星号,但这也不起作用:
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
我认为这是因为程序希望转义空格,但星号不会以这种方式扩展它们。我尝试过“管道”参数但无济于事:
user@office-debian:~/Desktop/docs$ ls | onedrive-cli put
usage: onedrive-cli put [-h] [-n] file [folder]
onedrive-cli put: error: too few arguments
显然onedrive-cli
不认识STDIN
。还有其他简单的选择吗?我意识到我可能可以写一个脚本,但我真的希望避免这种情况!
以下似乎有效,但这并不是我真正想要的:
for files in * ; do
onedrive-cli put "$files"
done
答案1
usage: onedrive-cli put [-h] [-n] file [folder]
这表明程序put
的子命令onedrive-cli
必须具有一个或两个非选项参数。文件是必需的(要上传的本地文件名),文件夹是可选的(要上传到的远程文件夹)。
该命令onedrive-cli put *
将当前目录中所有文件的名称作为参数传递。无论文件名可能包含什么奇怪的字符,它都可以工作。问题在于该onedrive-cli
程序不接受多个文件作为参数,这与许多文件操作命令不同。
循环是执行此操作的正确方法:
for file in * ; do
onedrive-cli put "$file"
done
如果命令必须为每个文件重新向服务器进行身份验证,则循环可能会很慢。似乎没有办法更好地使用所提供的“onedrive-cli-”工具。你可以写几行Python(警告:完全未经测试!特别是我不知道如何发出错误信号。)
#!/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)
¹例外:由于历史原因,*
省略名称以 a 开头的文件.
(点文件)。
答案2
用 find 来 cl 可能会更容易。
find ~/Desktop/docs -type f -exec overdrive-cli put {} \;
exec 将获取每个文件句柄并将其输入到列出的命令中。 {} 表示文件名,\; 表示文件名。指定 exec 的结束。因此,如果您想确保每个文件仅上传一次,您甚至可以使用以下命令。
find ~/Desktop/docs -type f -exec overdrive-cli put {}; mv {} ~/Desktop/old-docs \;
{} 可能需要用双引号来处理空格,但这不太可能。
答案3
如果以下方法不起作用...
cd ./target_dir
set -- *
onedrive-cli put "$@"
那么可能是因为您需要put
为每个参数提供一个,在这种情况下,这可能是:
{ printf 'one-drive-cli'
printf " put ///%s///" *
} | sed 's|'\''|&"&"&|g;s|///|'\''|g' |
. /dev/stdin
但如果那如果不起作用,那么您的for
循环可能是最好的 shell 解决方案,因为您的 python 脚本仅支持每次调用一次上传。
最好的方法是编辑 python 脚本来满足您的需求。
答案4
列出要上传的文件地址。确保其中没有 和 空格。然后写
import os
#files is the list of addresses
for address in files:
os.system("onedrive-cli put " + address)