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

qua*_*ant 5 shell files arguments

我正在尝试Microsoft OneDrive使用 将文档上传到我的帐户python-onedrive。我正在使用的命令是这样的:

onedrive-cli put Long\ Filename\ 1.jpg
onedrive-cli put Long\ Filename\ 2.jpg
Run Code Online (Sandbox Code Playgroud)

问题是这些文件有很多,我想上传所有这些文件(没有上传整个目录的选项)。我使用了星号,但这也不起作用:

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
Run Code Online (Sandbox Code Playgroud)

我认为这是因为程序希望转义空格,但星号不会以这种方式扩展它们。我尝试过“管道”参数但无济于事:

user@office-debian:~/Desktop/docs$ ls | onedrive-cli put
usage: onedrive-cli put [-h] [-n] file [folder]
onedrive-cli put: error: too few arguments
Run Code Online (Sandbox Code Playgroud)

显然onedrive-cli不认识STDIN。还有其他简单的选择吗?我意识到我可能可以写一个脚本,但我真的希望避免这种情况!

以下似乎有效,但这并不是我真正想要的:

for files in * ; do
  onedrive-cli put "$files"
done
Run Code Online (Sandbox Code Playgroud)

mik*_*erv 0

如果以下方法不起作用...

cd ./target_dir
    set -- *
    onedrive-cli put "$@"
Run Code Online (Sandbox Code Playgroud)

那么可能是因为您需要put为每个参数提供一个,在这种情况下,这可能是:

{    printf 'one-drive-cli' 
     printf " put ///%s///" *
} | sed 's|'\''|&"&"&|g;s|///|'\''|g' |
. /dev/stdin 
Run Code Online (Sandbox Code Playgroud)

但如果不起作用,那么您的for循环可能是最好的 shell 解决方案,因为您的 python 脚本仅支持每次调用一次上传。

最好的方法是编辑 python 脚本来满足您的需求。