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

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

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)

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

答え2

clにfindを使用する方が簡単かもしれません。

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 "$@"

各パラメータに1つずつ提供する必要があるかもしれませんput。この場合、次のようになります。

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

しかし、もしそれそれでも機能しない場合、forPythonスクリプトは呼び出しごとに1つのアップロードしかサポートしないため、ループはおそらく最高のシェルソリューションです。

最善の方法は、必要に応じてPythonスクリプトを編集することです。

答え4

アップロードするファイルアドレスを一覧表示します。スペースがないことを確認してください。それから書いてください

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

関連情報