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)
¹예외 : 역사적인 이유로 *
이름이 .
(점 파일)로 시작하는 파일은 생략됩니다.
답변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 "$@"
각 매개변수에 대해 하나씩 제공 해야 할 수도 있습니다 put
. 이 경우 다음과 같습니다.
{ printf 'one-drive-cli'
printf " put ///%s///" *
} | sed 's|'\''|&"&"&|g;s|///|'\''|g' |
. /dev/stdin
하지만 만약에저것그래도 작동하지 않으면 for
Python 스크립트가 호출당 하나의 업로드만 지원하므로 루프가 아마도 최고의 셸 솔루션일 것입니다.
가장 좋은 방법은 필요에 맞게 Python 스크립트를 편집하는 것입니다.
답변4
업로드할 파일 주소를 나열합니다. 공백이 없는지 확인하세요. 그럼 쓰세요
import os
#files is the list of addresses
for address in files:
os.system("onedrive-cli put " + address)