ディレクトリ内のファイルのリストをコマンドラインプログラムにどのように渡しますか?

ディレクトリ内のファイルのリストをコマンドラインプログラムにどのように渡しますか?

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オプションではない引数が1つまたは2つあることを示します。ファイルは必須(アップロードするローカルファイル名)、フォルダはオプション(アップロードするリモートフォルダ)です。

このコマンドは、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)

¹例外: 歴史的な理由から、*名前が.(ドットファイル)で始まるファイルは省略されます.

おすすめ記事