如何向命令行程序传递目录中的文件列表?

如何向命令行程序传递目录中的文件列表?

我正在尝试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)

相关内容