{"id":13464710,"url":"https://github.com/odeke-em/drive","last_synced_at":"2025-12-16T18:28:45.175Z","repository":{"id":22763821,"uuid":"26109545","full_name":"odeke-em/drive","owner":"odeke-em","description":"Google Drive client for the commandline","archived":false,"fork":true,"pushed_at":"2024-02-09T18:41:35.000Z","size":4808,"stargazers_count":6712,"open_issues_count":285,"forks_count":429,"subscribers_count":169,"default_branch":"master","last_synced_at":"2025-03-23T19:51:29.703Z","etag":null,"topics":["cli","cloud","golang","google-drive","storage","sync"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"rakyll/drive","license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/odeke-em.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-11-03T08:18:11.000Z","updated_at":"2025-03-21T15:40:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/odeke-em/drive","commit_stats":null,"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeke-em%2Fdrive","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeke-em%2Fdrive/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeke-em%2Fdrive/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeke-em%2Fdrive/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/odeke-em","download_url":"https://codeload.github.com/odeke-em/drive/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245454123,"owners_count":20617984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cloud","golang","google-drive","storage","sync"],"created_at":"2024-07-31T14:00:49.089Z","updated_at":"2025-12-16T18:28:40.103Z","avatar_url":"https://github.com/odeke-em.png","language":"Go","readme":"# drive\n\n[![Build Status](https://travis-ci.org/odeke-em/drive.png?branch=master)](https://travis-ci.org/odeke-em/drive)\n\n`drive` is a tiny program to pull or push [Google Drive](https://drive.google.com) files.\n\n`drive` was originally developed by [Burcu Dogan](https://github.com/rakyll) while working on the Google Drive team. Since she is very busy and no longer able to maintain it, I took over drive on `Thursday, 1st January 2015`. This repository contains the latest version of the code.\n\n## Table of Contents\n\n- [Installing](#installing)\n  - [Requirements](#requirements)\n  - [From sources](#from-sources)\n  - [Godep](#godep)\n  - [Platform Packages](#platform-packages)\n    - [Automation Scripts](#automation-scripts)\n  - [Cross Compilation](#cross-compilation)\n  - [API keys](#api-keys)\n- [Usage](#usage)\n  - [Hyphens: - vs --](#hyphens---vs---)\n  - [Initializing](#initializing)\n  - [De Initializing](#de-initializing)\n  - [Traversal Depth](#traversal-depth)\n  - [Configuring General Settings](#configuring-general-settings)\n  - [Excluding And Including Objects](#excluding-and-including-objects)\n    - [Sample .driveignore with the exclude and include clauses combined](sample-.driveignore-with-the-exclude-and-include-clauses-combined)\n  - [Pulling](#pulling)\n    - [Verifying Checksums](#verifying-checksums)\n    - [Exporting Docs](#exporting-docs)\n  - [Pushing](#pushing)\n  - [Pulling And Pushing Notes](#pulling-and-pushing-notes)\n  - [End to End Encryption](#end-to-end-encryption)\n  - [Publishing](#publishing)\n  - [Unpublishing](#unpublishing)\n  - [Sharing and Emailing](#sharing-and-emailing)\n  - [Unsharing](#unsharing)\n  - [Starring Or Unstarring](#starring-or-unstarring)\n  - [Diffing](#diffing)\n  - [Touching](#touching)\n  - [Trashing And Untrashing](#trashing-and-untrashing)\n  - [Emptying The Trash](#emptying-the-trash)\n  - [Deleting](#deleting)\n  - [Listing](#listing)\n  - [Stating](#stating)\n  - [Printing URL](#printing-url)\n  - [Editing Description](#editing-description)\n  - [Retrieving MD5 Checksums](#retrieving-md5-checksums)\n  - [Retrieving FileId](#retrieving-fileid)\n  - [Retrieving Quota](#retrieving-quota)\n  - [Retrieving Features](#retrieving-features)\n  - [Creating](#creating)\n  - [Opening](#opening)\n  - [Copying](#copying)\n  - [Moving](#moving)\n  - [Renaming](#renaming)\n  - [Command Aliases](#command-aliases)\n  - [Detecting And Fixing Clashes](#detecting-and-fixing-clashes)\n  - [.desktop Files](#desktop-files)\n  - [Fetching And Pruning Missing Index Files](#fetching-and-pruning-missing-index-files)\n  - [Drive Server](#drive-server)\n  - [QR Code Share](#qr-code-share)\n  - [About](#about)\n  - [Help](#help)\n  - [Filing Issues](#filing-issues)\n- [Revoking Account Access](#revoking-account-access)\n- [Uninstalling](#uninstalling)\n- [Applying Patches](#applying-patches)\n- [Why Another Google Drive Client?](#why-another-google-drive-client)\n- [Known Issues](#known-issues)\n- [Reaching Out](#reaching-out)\n- [Disclaimer](#disclaimer)\n- [LICENSE](#license)\n\n## Installing\n\n### Requirements\n\ngo 1.9.X or higher is required. See [here](https://golang.org/doc/install) for installation instructions and platform installers.\n\n* Make sure to set your GOPATH in your env, .bashrc or .bash\\_profile file. If you have not yet set it, you can do so like this:\n\n```shell\ncat \u003c\u003c ! \u003e\u003e ~/.bashrc\n\u003e export GOPATH=\\$HOME/gopath\n\u003e export PATH=\\$GOPATH:\\$GOPATH/bin:\\$PATH\n\u003e !\nsource ~/.bashrc # To reload the settings and get the newly set ones # Or open a fresh terminal\n```\nThe above setup will ensure that the drive binary after compilation can be invoked from your current path.\n\n### From sources\n\nTo install from the latest source, run:\n\n```shell\ngo get -u github.com/odeke-em/drive/cmd/drive\n```\n\nOtherwise:\n\n* In order to address [issue #138](https://github.com/odeke-em/drive/issues/138), where debug information should be bundled with the binary, you'll need to run:\n\n```shell\ngo get github.com/odeke-em/drive/drive-gen \u0026\u0026 drive-gen\n```\n\nIn case you need a specific binary e.g for Debian folks [issue #271](https://github.com/odeke-em/drive/issues/271) and [issue 277](https://github.com/odeke-em/drive/issues/277)\n\n```shell\ngo get -u github.com/odeke-em/drive/drive-google\n```\n\nThat should produce a binary `drive-google`\n\nOR\n\nTo bundle debug information with the binary, you can run:\n\n```shell\ngo get -u github.com/odeke-em/drive/drive-gen \u0026\u0026 drive-gen drive-google\n```\n\n### Godep\n\n+ Using godep\n```\ncd $GOPATH/src/github.com/odeke-em/drive/drive-gen \u0026\u0026 godep save\n```\n\n+ Unravelling/Restoring dependencies\n```\ncd $GOPATH/src/github.com/odeke-em/drive/drive-gen \u0026\u0026 godep restore\n```\n\nPlease see file `drive-gen/README.md` for more information.\n\n### Platform Packages\n\nFor packages on your favorite platform, please see file [Platform Packages.md](https://github.com/odeke-em/drive/blob/master/platform_packages.md).\n\nIs your platform missing a package? Feel free to prepare / contribute an installation package and then submit a PR to add it in.\n\n#### Automation Scripts\n\nYou can install scripts for automating major drive commands and syncing from [drive-google wiki](https://gitlab.com/jean-christophe-manciot/Drive/wikis/Drive-Automation-Scripts:-Startup-Guide-and-Screenshots), also described in [platform_packages.md](https://github.com/odeke-em/drive/blob/master/platform_packages.md).\nSome screenshots are available [here](https://gitlab.com/jean-christophe-manciot/Drive/wikis/Drive-Automation-Scripts:-Startup-Guide-and-Screenshots#drive-menu-screenshots).\n\n### Cross Compilation\n\nSee file `Makefile` which currently supports cross compilation. Just run `make` and then inspect the binaries in directory `bin`.\n\n* Supported platforms to cross compile to:\n- ARMv5.\n- ARMv6.\n- ARMv7.\n- ARMv8.\n- Darwin (OS X).\n- Linux.\n\nAlso inspect file `bin/md5Sums.txt` after the cross compilation.\n\n### API keys\n\nOptionally set the `GOOGLE_API_CLIENT_ID` and `GOOGLE_API_CLIENT_SECRET` environment variables to use your own API keys.\n\n## Usage\n\n### Hyphens: - vs --\n\nA single hyphen `-` can be used to specify options. However two hyphens `--` can be used with any options in the provided examples below.\n\n### Initializing\n\nBefore you can use `drive`, you'll need to mount your Google Drive directory on your local file system:\n\n#### OAuth2.0 credentials\n```shell\ndrive init ~/gdrive\ncd ~/gdrive\n```\n\n#### Google Service Account credentials\n```shell\ndrive init --service-account-file \u003cgsa_json_file_path\u003e ~/gdrive\ncd ~/gdrive\n```\n\nWhere \u003cgsa_json_file_path\u003e must be a [Google Service Account credentials](https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount) file in JSON form.\nThis feature was implemented as requested by:\n+ https://github.com/odeke-em/drive/issues/879\n\n\n### De Initializing\n\nThe opposite of `drive init`, it will remove your credentials locally as well as configuration associated files.\n\n```shell\ndrive deinit [-no-prompt]\n```\n\nFor a complete deinitialization, don't forget to revoke account access, [please see revoking account access](#revoking-account-access)\n\n### Traversal Depth\n\nBefore talking about the features of drive, it is useful to know about \"Traversal Depth\".\n\nThroughout this README the usage of the term \"Traversal Depth\" refers to the number of\n\nnodes/hops/items that it takes to get from one parent to children. In the options that allow it, you'll have a flag option `-depth \u003cn\u003e` where n is an integer\n\n* Traversal terminates on encountering a zero `0` traversal depth.\n\n* A negative depth indicates infinity, so traverse as deep as you can.\n\n* A positive depth helps control the reach.\n\nGiven:\n\n\t|- A/\n\t\t|- B/\n\t\t|- C/\n\t\t\t|- C1\n\t\t\t|- C2\n\t\t\t\t|- C10/\n\t\t\t\t|- CTX/\n\t\t\t\t\t| - Music\n\t\t\t\t\t| - Summary.txt\n\n+ Items on the first level relative to A/ ie `depth 1`, we'll have:\n\n  B, C\n\n+ On the third level relative to C/ ie `depth 3`\n\n  * We'll have:\n  \n    Items: Music, Summary.txt\n\n  * The items encountered in `depth 3` traversal relative to C/ are:\n\n\t\t\t\t|- C1\n\t\t\t\t|- C2\n\t\t\t\t\t|- C10/\n\t\t\t\t\t|- CTX/\n\t\t\t\t\t\t| - Music\n\t\t\t\t\t\t| - Summary.txt\n\n+ No items are within the reach of  `depth -1` relative to B/ since B/ has no children.\n\n+ Items within the reach of `depth -` relative to CTX/ are:\n\n\t\t\t\t| - Music\n\t\t\t\t| - Summary.txt\n\n### Configuring General Settings\n\ndrive supports resource configuration files (.driverc) that you can place both globally (in your home directory)\nand locally(in the mounted drive dir) or in the directory that you are running an operation from, relative to the root.\nThe entries for a .driverc file is in the form a key-value pair where the key is any of the arguments that you'd get\nfrom running\n```shell\ndrive \u003ccommand\u003e -h\n# e.g\ndrive push -h\n```\n\nand the value is the argument that you'd ordinarily supply on the commandline.\n.driverc configurations can be optionally grouped in sections. See https://github.com/odeke-em/drive/issues/778.\n\nFor example:\n\n```shell\ncat \u003c\u003c ! \u003e\u003e ~/.driverc\n\u003e # My global .driverc file\n\u003e export=doc,pdf\n\u003e depth=100\n\u003e no-prompt=true\n\u003e\n\u003e # For lists\n\u003e [list]\n\u003e depth=2\n\u003e long=true\n\u003e\n\u003e # For pushes\n\u003e [push]\n\u003e verbose=false\n\u003e\n\u003e # For stats\n\u003e [stat]\n\u003e depth=3\n\u003e\n\u003e # For pulls and pushes\n\u003e [pull/push]\n\u003e no-clobber=true\n\u003e !\n\ncat \u003c\u003c ! \u003e\u003e ~/emm.odeke-drive/.driverc\n\u003e # The root main .driverc\n\u003e depth=-1\n\u003e hidden=false\n\u003e no-clobber=true\n\u003e exports-dir=$HOME/exports\n\u003e !\n\ncat \u003c\u003c $ \u003e\u003e ~/emm.odeke-drive/fall2015Classes/.driverc\n\u003e # My global .driverc file\n\u003e exports-dir=$HOME/Desktop/exports\n\u003e export=pdf,csv,txt\n\u003e hidden=true\n\u003e depth=10\n\u003e exclude-ops=delete,update\n\u003e $\n```\n\n### Excluding and Including Objects\n\ndrive allows you to specify a '.driveignore' file similar to your .gitignore, in the root\ndirectory of the mounted drive. Blank lines and those prefixed by '#' are considered as comments and skipped.\n\nFor example:\n\n```shell\ncat \u003c\u003c $ \u003e\u003e .driveignore\n\u003e # My drive ignore file\n\u003e \\.gd$\n\u003e \\.so$\n\u003e \\.swp$\n\u003e $\n```\n\nNote:\n  * Pattern matching and suffixes are done by regular expression matching so make sure to use a valid regular expression suffix.\n\n  * Go doesn't have a negative lookahead mechanism ie `exclude all but` which would\n    normally be achieved in other languages or regex engines by \"?!\". See https://groups.google.com/forum/#!topic/golang-nuts/7qgSDWPIh_E.\n    This was reported and requested in [issue #535](https://github.com/odeke-em/drive/issues/535).\n    A use case might be ignoring all but say .bashrc files or .dotfiles.\n    To enable this, prefix \"!\" at the beginning of the path to achieve this behavior.\n\n#### Sample .driveignore with the exclude and include clauses combined\n```shell\ncat \u003c\u003c $ \u003e\u003e .driveignore\n\u003e ^\\.\n\u003e !^\\.bashrc # .bashrc files won't be ignored\n\u003e _export$ # _export files are to be ignored\n\u003e !must_export$ # the exception to the clause anything with \"must_export\"$ won't be ignored\n```\n\n### Pulling\n\nThe `pull` command downloads data that does not exist locally but does remotely on Google drive, and may delete local data that is not present on Google Drive. \nRun it without any arguments to pull all of the files from the current path:\n\n```shell\ndrive pull\n```\n\nTo pull and decrypt your data that is stored encrypted at rest on Google Drive, use flag `-decryption-password`:\n\nSee [Issue #543](https://github.com/odeke-em/drive/issues/543)\n\n```shell\ndrive pull -decryption-password '$JiME5Umf' influx.txt\n```\n\nPulling by matches is also supported\n\n```shell\ncd ~/myDrive/content/2015\ndrive pull -matches vines docx\n```\n\nTo force download from paths that otherwise would be marked with no-changes\n\n```shell\ndrive pull -force\n```\n\nTo pull specific files or directories, pass in one or more paths:\n\n```shell\ndrive pull photos/img001.png docs\n```\n\nPulling by id is also supported\n\n```shell\ndrive pull -id 0fM9rt0Yc9RTPaDdsNzg1dXVjM0E 0fM9rt0Yc9RTPaTVGc1pzODN1NjQ 0fM9rt0Yc9RTPV1NaNFp5WlV3dlU\n```\n\n`pull` optionally allows you to pull content up to a desired depth.\n\nSay you would like to get just folder items until the second level\n\n```shell\ndrive pull -depth 2 heavy-files summaries\n```\n\nTraverse deep to infinity and beyond\n\n```shell\ndrive pull -depth -1 all-my-files\n```\n\nPulling starred files is allowed as well\n\n```shell\ndrive pull -starred\ndrive pull -starred -matches content\ndrive pull -starred -all # Pull all the starred files that aren't in the trash\ndrive pull -starred -all -trashed # Pull all the starred files in the trash\n```\n\nLike most commands [.driveignore](#excluding-and-including-objects) can be used to filter which files to pull.\n\n+ Note: Use `drive pull -hidden` to also pull files starting with `.` like `.git`.\n\nTo selectively pull by type e.g file vs directory/folder, you can use flags\n- `files`\n- `directories`\n\n```shell\ndrive pull -files a1/b2\ndrive pull -directories tf1\n```\n\n#### Verifying Checksums\nDue to popular demand, by default, checksum verification is turned off. It was deemed to be quite vigorous and unnecessary for most cases, in which size + modTime differences are sufficient to detect file changes. The discussion stemmed from issue [#117](https://github.com/odeke-em/drive/issues/117).\n\nHowever, modTime differences on their own do not warrant a resync of the contents of file.\nModification time changes are operations of their own and can be made:\n+ locally by, touching a file (chtimes).\n+ remotely by just changing the modTime meta data.\n\nTo turn checksum verification back on:\n\n```shell\ndrive pull -ignore-checksum=false\n```\n\ndrive also supports piping pulled content to stdout which can be accomplished by:\n\n```shell\ndrive pull -piped path1 path2\n```\n\n+ In relation to issue #529, you can change the max retry counts for exponential backoff. Using a count \u003c 0 falls back to the\ndefault count of 20:\n```shell\ndrive pull -retry-count 14 documents/2016/March videos/2013/September\n```\n\n#### Exporting Docs\n\nBy default, the `pull` command will export Google Docs documents as PDF files. To specify other formats, use the `-export` option:\n\n```shell\ndrive pull -export pdf,rtf,docx,txt\n```\n\nTo explicitly export instead of using `-force`\n\n```shell\ndrive pull -export pdf,rtf,docx,txt -explicitly-export\n```\n\nBy default, the exported files will be placed in a new directory suffixed by `\\_exports` in the same path. To export the files to a different directory, use the `-exports-dir` option:\n\n```shell\ndrive pull -export pdf,rtf,docx,txt -exports-dir ~/Desktop/exports\n```\n\nOtherwise, you can export files to the same directory as requested in [issue #660](https://github.com/odeke-em/drive/issues/660),\nby using pull flag `-same-exports-dir`. For example:\n```shell\ndrive pull -explicitly-export -exports-dir ~/Desktop/exp -export pdf,txt,odt -same-exports-dir \nResolving...\n+ /test-exports/few.docs\n+ /test-exports/few\n+ /test-exports/influx\nAddition count 3\nProceed with the changes? [Y/n]:y\nExported '/Users/emmanuelodeke/emm.odeke@gmail.com/test-exports/influx' to '/Users/emmanuelodeke/Desktop/exp/influx.pdf'\nExported '/Users/emmanuelodeke/emm.odeke@gmail.com/test-exports/influx' to '/Users/emmanuelodeke/Desktop/exp/influx.txt'\nExported '/Users/emmanuelodeke/emm.odeke@gmail.com/test-exports/few' to '/Users/emmanuelodeke/Desktop/exp/few.pdf'\nExported '/Users/emmanuelodeke/emm.odeke@gmail.com/test-exports/few.docs' to '/Users/emmanuelodeke/Desktop/exp/few.docs.txt'\nExported '/Users/emmanuelodeke/emm.odeke@gmail.com/test-exports/few.docs' to '/Users/emmanuelodeke/Desktop/exp/few.docs.odt'\nExported '/Users/emmanuelodeke/emm.odeke@gmail.com/test-exports/few.docs' to '/Users/emmanuelodeke/Desktop/exp/few.docs.pdf'\n```\n\n**Supported formats:**\n\n* doc, docx\n* jpeg, jpg\n* gif\n* html\n* odt\n* ods\n* rtf\n* pdf\n* png\n* ppt, pptx\n* svg\n* txt, text\n* xls, xlsx\n\n### Pushing\n\nThe `push` command uploads data to Google Drive to mirror data stored locally.\n\nLike `pull`, you can run it without any arguments to push all of the files from the current path, or you can pass in one or more paths to push specific files or directories.\n\n`push` also allows you to push content up to a desired traversal depth e.g\n\n```shell\ndrive push -depth 1 head-folders\n```\n\n`drive push path` expects the path to be within the context of the drive. If the drive is locally at `~/grdrive`, `drive push ~/xyz.txt` may not execute as desired. Each path should reference a file or directory under the root directory of the mounted directory.\n\nYou can also push multiple paths that are children of the root of the mounted drive to a destination,\n\nin relation to issue #612, using key `-destination`:\n\nFor example to push the content of `music/Travi$+Future`, `integrals/complex/compilations` directly to `a1/b2/c3`:\n\n```shell\ndrive push -destination a1/b2/c3 music/Travi$+Future integrals/complex/compilations\n```\n\nTo enable checksum verification during a push:\n\n```shell\ndrive push -ignore-checksum=false\n```\n\nTo keep your data encrypted at rest remotely on Google Drive:\n\n```shell\ndrive push -encryption-password '$JiME5Umf' influx.txt\n```\nFor E2E discussions, see [issue #543](https://github.com/odeke-em/issues/543):\n\ndrive also supports pushing content piped from stdin which can be accomplished by:\n\n```shell\ndrive push -piped path\n```\n\nTo selectively push by type e.g file vs directory/folder, you can use flags\n- `files`\n- `directories`\n\n```shell\ndrive push -files a1/b2\ndrive push -directories tf1\n```\n\nLike most commands [.driveignore](#excluding-and-including-objects) can be used to filter which files to push.\n\n+ Note: Use `drive push -hidden` to also push files starting with `.` like `.git`.\n\nHere is an example using drive to backup the current working directory. It pushes a tar.gz archive created on the fly. No archive file is made on the machine running the command, so it doesn't waste disk space.\n\n```shell\ntar czf - . | drive push -piped backup-$(date +\"%m-%d-%Y-\"%T\"\").tar.gz\n```\n\n+ Note:\n  * In response to [#107](https://github.com/odeke-em/drive/issues/107) and numerous other issues related to confusion about clashing paths, drive can now auto-rename clashing files. Use flag `-fix-clashes` during a `pull` or `push`, and drive will try to rename clashing files by adding a unique suffix at the end of the name, but right before the extension of a file (if the extension exists). If you haven't passed in the above `-fix-clashes` flag, drive will abort on trying to deal with clashing names. If you'd like to turn off this safety, pass in flag `-ignore-name-clashes`\n  * In relation to [#57](https://github.com/odeke-em/drive/issues/57) and [@rakyll's #49](https://github.com/rakyll/drive/issues/49).\n   A couple of scenarios in which data was getting totally clobbered and unrecoverable, drive now tries to play it safe and warn you if your data could potentially be lost e.g during a to-disk clobber for which you have no backup. At least with a push you have the luxury of untrashing content. To disable this safety, run drive with flag `-ignore-conflict` e.g:\n\n    ```shell\n    drive pull -ignore-conflict collaboration_documents\n    ```\n\n    Playing the safety card even more, if you want to get changes that are non clobberable ie only additions\n    run drive with flag `-no-clobber` e.g:\n\n    ```shell\n    drive pull -no-clobber Makefile\n    ```\n\n  * Ordinarily your system will not traverse nested symlinks e.g:\n  ```shell\n    mkdir -p a/b\n    mkdir -p ~/Desktop/z1/z2 \u0026\u0026 ls ~ \u003e ~/Desktop/z1/z2/listing.txt\n    ln -s ~/Desktop/z1/z2 a/b\n    ls -R a # Should print only z2 and nothing inside it. \n  ```\n\n    However in relation to [#80](https://github.com/odeke-em/drive/issues/80), for purposes of consistency with your Drive, traversing symlinks has been added.\n\nFor safety with non clobberable changes i.e only additions:\n\n```shell\ndrive push -no-clobber\n```\n\n+ Due to the reasons above, drive should be able to warn you in case of total clobbers on data. To turn off this behaviour/safety, pass in the `-ignore-conflict` flag i.e:\n\n```shell\ndrive push -force sure_of_content\n```\n\nTo push without user input (i.e. without prompt)\n```shell\ndrive push -quiet\n```\nor\n```shell\ndrive push -no-prompt\n```\n\nTo get Google Drive to convert a file to its native Google Docs format\n\n```shell\ndrive push -convert\n```\nExtra features: to make Google Drive attempt Optical Character Recognition (OCR) for png, gif, pdf and jpg files.\n\n```shell\ndrive push -ocr\n```\nNote: To use OCR, your account should have this feature. You can find out if your account has OCR allowed.\n\n```shell\ndrive features\n```\n\n### Pulling And Pushing Notes\n\n+ MimeType inference is from the file's extension.\n\n  If you would like to coerce a certain mimeType that you'd prefer to assert with Google Drive pushes, use flag `-coerce-mime \u003cshort-key\u003e` See [List of MIME type short keys](https://github.com/odeke-em/drive/wiki/List-of-MIME-type-short-keys) for the full list of short keys.\n\n```shell\ndrive push -coerce-mime docx my_test_doc\n```\n\n+ Excluding certain operations can be done both for pull and push by passing in flag\n`-exclude-ops` \u003ccsv_crud_values\u003e\n\ne.g\n\n```shell\ndrive pull -exclude-ops \"delete,update\" vines\ndrive push -exclude-ops \"create\" sensitive_files\n```\n\n+ To show more information during pushes or pulls e.g show the current operation,\npass in option `-verbose` e.g:\n\n```shell\ndrive pull -verbose 2015/Photos content\ndrive push -verbose Music Fall2014\n```\n\n+ In relation to issue #529, you can change the max retry counts for exponential backoff. Using a count \u003c 0 falls back to the\ndefault count of 20:\n```shell\ndrive push -retry-count 4 a/bc/def terms\n```\n\n* You can also specify the upload chunk size to be used to push each file, by using flag\n`-upload-chunk-size` whose value is in bytes. If you don't specify this flag, by default\nthe internal Google APIs use a value of 8MiB from constant `googleapi.DefaultUploadChunkSize`.\nPlease note that your value has to be a multiple of and atleast the minimum  upload chunksize\nof 256KiB from constant `googleapi.MinUploadChunkSize`. See https://godoc.org/google.golang.org/api/googleapi#pkg-constants.\n  If `-upload-chunk-size` is not set yet `-upload-rate-limit` is, `-upload-chunk-size` will be the same as `-upload-rate-limit`.\n\n* To limit the upload bandwidth, please set `-upload-rate-limit=n`. It's in `n` KiB/s, default is unlimited.\n\n### End to End Encryption\n\nSee [Issue #543](https://github.com/odeke-em/drive/issues/543)\n\nThis can be toggled when you supply a non-empty password ie\n\n- `-encryption-password` for a push.\n- `-decryption-password` for a pull.\n\nWhen you supply argument `-encryption-password` during a push, drive will encrypt your data\nand store it remotely encrypted(stored encrypted at rest), it can only be decrypted by you when you\nperform a pull with the respective arg `-decryption-password`.\n\n```shell\ndrive push -encryption-password '$400lsGO1Di3' few-ones.mp4 newest.mkv\n```\n\n```shell\ndrive pull -decryption-password '$400lsGO1Di3' few-ones.mp4 newest.mkv\n```\n\nIf you supply the wrong password, you'll be warned if it cannot be decrypted\n\n```shell\n$ drive pull -decryption-password \"4nG5troM\" few-ones.mp4 newest.mkv\nmessage corrupt or incorrect password\n```\n\nTo pull normally push or pull your content, without attempting any *cryption attempts, skip\npassing in a password and no attempts will be made.\n\n### Publishing\n\nThe `pub` command publishes a file or directory globally so that anyone can view it on the web using the link returned.\n\n```shell\ndrive pub photos\n```\n\n+ Publishing by fileId is also supported\n\n```shell\ndrive pub -id 0fM9rt0Yc9RTPV1NaNFp5WlV3dlU 0fM9rt0Yc9RTPSTZEanBsamZjUXM\n```\n\n### Unpublishing\n\nThe `unpub` command is the opposite of `pub`. It unpublishes a previously published file or directory.\n\n```shell\ndrive unpub photos\n```\n\n+ Publishing by fileId is also supported\n\n```shell\ndrive unpub -id 0fM9rt0Yc9RTPV1NaNFp5WlV3dlU 0fM9rt0Yc9RTPSTZEanBsamZjUXM\n```\n\n### Sharing and Emailing\n\nThe `share` command enables you to share a set of files with specific users and assign them specific roles as well as specific generic access to the files. It also allows for email notifications on share.\n\n```shell\ndrive share -emails odeke@ualberta.ca,odeke.ex@gmail.com -message \"This is the substring file I told you about\" -role reader,writer -type group mnt/substringfinder.c projects/kmp.c\n$ drive share -emails emm.odeke@gmail.com,odeke@ualberta.ca -role reader,commenter -type user influx traversal/notes/conquest\n```\n\nFor example to share a file with users of a mailing list and a custom message\n\n```shell\ndrive share -emails drive-mailing-list@gmail.com -message \"Here is the drive code\" -role group mnt/drive\n```\n\n+ By default, an email notification is sent (even if -message is not specfified). To turn off email notification, use -notify=false\n\n```shell\n$ drive share -notify=false -emails emm.odeke@gmail.com,odeke@ualberta.ca -role reader,commenter -type user influx traversal/notes/conquest\n```\n\n+ The `share` command also supports sharing by fileId\n\n```shell\ndrive share -emails developers@developers.devs -message \"Developers, developers developers\" -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n+ You can also share a file to only those with the link. As per [https://github.com/odeke-em/drive/issues/568](https://github.com/odeke-em/drive/issues/568), this file won't be publicly indexed. To turn this option on when sharing the file,\nuse flag `-with-link`.\n\n```shell\ndrive share -with-link ComedyPunchlineDrumSound.mp3\n```\n\n### Unsharing\n\nThe `unshare` command revokes access of a specific accountType to a set of files.\n\nWhen no -role is given it by default assumes you want to revoke all access ie \"reader\", \"writer\", \"commenter\"\n\n```shell\ndrive unshare -type group mnt/drive\ndrive unshare -emails  emm.odeke@gmail.com,odeke@ualberta.ca -type user,group -role reader,commenter infinity newfiles/confidential\n```\n\n+ Also supports unsharing by fileId\n\n```shell\ndrive unshare -type group -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n### Starring Or Unstarring\n\nTo star or unstar documents,\n\n```shell\ndrive star information quest/A/B/C\ndrive star -id 0fM9rt0Yc9RTPaDdsNzg1dXVjM0E 0fM9rt0Yc9RTPaTVGc1pzODN1NjQ 0fM9rt0Yc9RTPV1NaNFp5WlV3dlU\n```\n\n```shell\ndrive unstar information quest/A/B/C\ndrive unstar -id 0fM9rt0Yc9RTPaDdsNzg1dXVjM0E 0fM9rt0Yc9RTPaTVGc1pzODN1NjQ 0fM9rt0Yc9RTPV1NaNFp5WlV3dlU\n```\n\n### Diffing\n\nThe `diff` command compares local files with their remote equivalents. It allows for multiple paths to be passed in e.g\n\n```shell\ndrive diff changeLogs.log notes sub-folders/\n```\n\nYou can diff to a desired depth\n\n```shell\ndrive diff -depth 2 sub-folders/ contacts/ listings.txt\n```\n\nYou can also switch the base, either local or remote by using flag `-base-local`\n\n```shell\ndrive diff -base-local=true assignments photos # To use local as the base\ndrive diff -base-local=false infocom photos # To use remote as the base\n```\n\nYou can only diff for short changes that is only name differences, file modTimes and types, you can use flag `-skip-content-check`.\n\n```shell\ndrive diff -skip-content-check\n```\n\n### Touching\n\nFiles that exist remotely can be touched i.e their modification time updated to that on the remote server using the `touch` command:\n\n```shell\ndrive touch Photos/img001.png logs/log9907.txt\n```\n\nFor example to touch all files that begin with digits 0  to 9:\n\n```shell\ndrive touch -matches $(seq 0 9)\n```\n\n+ Also supports touching of files by fileId\n\n```shell\ndrive touch -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n+ You can also touch files to a desired depth of nesting within their parent folders.\n\n```shell\ndrive touch -depth 3 mnt newest flux\ndrive touch -depth -1 -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\ndrive touch -depth 1 -matches $(seq 0 9)\n```\n\n+ You can also touch and explicitly set the modification time for files by:\n```shell\ndrive touch -time 20120202120000 ComedyPunchlineDrumSound.mp3\n/share-testing/ComedyPunchlineDrumSound.mp3: 2012-02-02 12:00:00 +0000 UTC\n```\n\n+ Specify the time format that you'd like to use when specifying the time e.g\n```shell\ndrive touch -format \"2006-01-02-15:04:05.0000Z\" -time \"2016-02-03-08:12:15.0070Z\" outf.go\n/share-testing/outf.go: 2016-02-03 08:12:15 +0000 UTC\n```\nThe mentioned time format has to be relative to how you would represent\n\"Mon Jan 2 15:04:05 -0700 MST 2006\".\nSee the documentation for time formatting here [time.Parse](https://golang.org/pkg/time/#Parse)\n\n+ Specify the touch time offset from the clock on your machine where:\n- minus(-) means ago e.g 30 hours ago -\u003e -30h\n- blank or plus(+) means from now e.g 10 minutes -\u003e 10m or +10m\n```shell\ndrive touch -duration -30h ComedyPunchlineDrumSound.mp3 outf.go\n/share-testing/outf.go: 2016-09-10 08:06:39 +0000 UTC\n/share-testing/ComedyPunchlineDrumSound.mp3: 2016-09-10 08:06:39 +0000 UTC\n```\n\n### Trashing And Untrashing\n\nFiles can be trashed using the `trash` command:\n\n```shell\ndrive trash Demo\n```\n\nTo trash files that contain a prefix match e.g all files that begin with Untitled, or Make\n\nNote: This option uses the current working directory as the parent that the paths belong to.\n\n```shell\ndrive trash -matches Untitled Make\n```\n\nFiles that have been trashed can be restored using the `untrash` command:\n\n```shell\ndrive untrash Demo\n```\n\nTo untrash files that match a certain prefix pattern\n\n```shell\ndrive untrash -matches pQueue photos Untitled\n```\n\n+ Also supports trashing/untrashing by fileId\n\n```shell\ndrive trash -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\ndrive untrash -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n### Emptying The Trash\n\nEmptying the trash will permanently delete all trashed files. Caution: They cannot be recovered after running this command.\n\n```shell\ndrive emptytrash\n```\n\n### Deleting\n\nDeleting items will PERMANENTLY remove the items from your drive. This operation is irreversible.\n\n```shell\ndrive delete flux.mp4\n```\n\n```shell\ndrive delete -matches onyx swp\n```\n\n+ Also supports deletion by fileIds\n\n```shell\ndrive delete -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n### Listing\n\nThe `list` command shows a paginated list of files present remotely.\n\nRun it without arguments to list all files in the current directory's remote equivalent:\n\n```shell\ndrive list\n```\n\nPass in a directory path to list files in that directory:\n\n```shell\ndrive list photos\n```\n\nTo list matches\n\n```shell\ndrive list -matches mp4 go\n```\n\nThe `-trashed` option can be specified to show trashed files in the listing:\n\n```shell\ndrive list -trashed photos\n```\n\nTo get detailed information about the listings e.g owner information and the version number of all listed files:\n\n```shell\ndrive list -owners -l -version\n```\n\n+ Also supports listing by fileIds\n\n```shell\ndrive list -depth 3 -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n+ Listing allows for sorting by fields e.g `name`, `version`, `size, `modtime`, lastModifiedByMeTime `lvt`, `md5`. To do this in reverse order, suffix `_r` or `-` to the selected key\n\ne.g to first sort by modTime, then largest-to-smallest and finally most number of saves:\n\n```\ndrive list -sort modtime,size_r,version_r Photos\n```\n\n* For advanced listing\n\n```shell\ndrive list -skip-mime mp4,doc,txt\ndrive list -match-mime xls,docx\ndrive list -exact-title url_test,Photos\n```\n\n### Stating\n\nThe `stat` commands show detailed file information for example people with whom it is shared, their roles and accountTypes, and\nfileId etc. It is useful to help determine whom and what you want to be set when performing share/unshare\n\n```shell\ndrive stat mnt\n```\n\nBy default `stat` won't recursively stat a directory, to enable recursive stating:\n\n```shell\ndrive stat -r mnt\n```\n\n+ Also supports stat-ing by fileIds\n\n```shell\ndrive stat -r -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\nOR\n\n```shell\ndrive stat -depth 4 -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U\n```\n\n### Printing URL\n\nThe url command prints out the url of a file. It allows you to specify multiple paths relative to root or even by id\n\n```shell\ndrive url Photos/2015/07/Releases intros/flux\ndrive url -id  0Bz5qQkvRAeVEV0JtZl4zVUZFWWx  1Pwu8lzYc9RTPTEpwYjhRMnlSbDQ 0Cz5qUrvDBeX4RUFFbFZ5UXhKZm8\n```\n\n### Editing Description\n\nYou can edit the description of a file like this\n\n```shell\ndrive edit-desc -description \"This is a new file description\" freshFolders/1.txt commonCore/\ndrive edit-description -description \"This is a new file description\" freshFolders/1.txt commonCore/\n```\n\nEven more conveniently by piping content\n\n```shell\ncat fileDescriptions | drive edit-desc -piped  targetFile influx/1.txt\n```\n\n### Retrieving MD5 Checksums\n\nThe `md5sum` command quickly retrieves the md5 checksums of the files on your drive. The result can be fed into the \"md5sum -c\" shell command to validate the integrity of the files on Drive versus the local copies.\n\nCheck that files on Drive are present and match local files:\n\n```shell\n~/MyDrive/folder$ drive md5sum | md5sum -c\n```\n\nDo a two-way diff (will also locate files missing on either side)\n\n```shell\n~/MyDrive/folder$ diff \u003c(drive md5sum) \u003c(md5sum *)\n```\n\nSame as above, but include subfolders \n\n```shell\n~/MyDrive/folder$ diff \u003c(drive md5sum -r) \u003c(find * -type f | sort | xargs md5sum)\n```\n\nCompare across two different Drive accounts, including subfolders\n\n```shell\n~$ diff \u003c(drive md5sum -r MyDrive/folder) \u003c(drive md5sum -r OtherDrive/otherfolder)\n```\n\n* Note: Running the 'drive md5sum' command retrieves pre-computed md5 sums from Drive; its speed is proportional to the number of files on Drive. Running the shell 'md5sum' command on local files requires reading through the files; its speed is proportional to the size of the files._\n\n### Retrieving FileId\n\nYou can retrieve just the fileId for specified paths\n```shell\ndrive id [-depth n] [paths...]\ndrive file-id [-depth n] [paths...]\n```\n\nFor example:\n\n```shell\ndrive file-id -depth 2 dup-tests bug-reproductions\n# drive file-id -depth 2 dup-tests bug-reproductions\nFileId                                           Relative Path\n\"0By5qKlgRJeV2NB1OTlpmSkg8TFU\"                   \"/dup-tests\"\n\"0Bz5wQlgRJeP2QkRSenBTaUowU3c\"                   \"/dup-tests/influx_0\"\n\"0Cu5wQlgRJeV2d2VmY29HV217TFE\"                   \"/dup-tests/a\"\n\"0Cy5wQlgRJeX2WXVFMnQyQ2NDRTQ\"                   \"/dup-tests/influx\"\n\"0Cy5wQlgRJeP2YGMiOC15OEpUZnM\"                   \"/bug-reproductions\"\n\"0Cy5wQlgRJeV2MzFtTm50NVV5NW8\"                   \"/bug-reproductions/drive-406\"\n\"1xmXPziMPEgq2dK-JqaUytKz_By8S_7_RVY79ceRoZwv\"\t \"info-bulletins\"\n```\n\n### Retrieving Quota\n\nThe `quota` command prints information about your drive, such as the account type, bytes used/free, and the total amount of storage available.\n\n```shell\ndrive quota\n```\n\n### Retrieving Features\n\nThe `features` command provides information about the features present on the\ndrive being queried and the request limit in queries per second\n\n```shell\ndrive features\n```\n\n### Creating\n\ndrive allows you to create an empty file or folder remotely\nSample usage:\n\n```shell\ndrive new -folder flux\ndrive new -mime-key doc bofx\ndrive new -mime-key folder content\ndrive new -mime-key presentation ProjectsPresentation\ndrive new -mime-key sheet Hours2015Sept\ndrive new -mime-key form taxForm2016 taxFormCounty\ndrive new flux.txt oxen.pdf # Allow auto type resolution from the extension\n```\n\n### Opening\n\nThe open command allows for files to be opened by the default file browser, default web browser, either by path or by id for paths that exist atleast remotely\n\n```shell\ndrive open -file-browser=false -web-browser f1/f2/f3 jamaican.mp4\ndrive open -file-browser -id 0Bz8qQkpZAeV9T1PObvs2Y3BMQEj 0Y9jtQkpXAeV9M1PObvs4Y3BNRFk\n```\n\n### Copying\n\ndrive allows you to copy content remotely without having to explicitly download and then reupload.\n\n```shell\ndrive copy -r blobStore.py mnt flagging\n```\n\n```shell\ndrive copy blobStore.py blobStoreDuplicated.py\n```\n\n+ Also supports copying by fileIds\n\n```shell\ndrive copy -r -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U ../content\n```\n\n### Moving\n\ndrive allows you to move content remotely between folders. To do so:\n\n```shell\ndrive move photos/2015 angles library archives/storage\n```\n\n+ Also supports moving by fileId\n\n```shell\ndrive move -id 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 0fM9rt0Yc9kJRPSTFNk9kSTVvb0U ../../new_location\n```\n\nGoogle Drive supports multi-parent folder structure, where one file/folder can be placed in more than one parent folder.\nIt consumes no extra disk space on the Cloud, but after pulling such structure it may double your files several times in your file structure.\nPushing non deduplicated folder structures back may also break things, so be careful.\n\nTo place file/folder into new parent folder, keeping old one as well, use `-keep-parent` option\n\n```shell\n$ drive move -keep-parent photos/2015 angles library second_parent_folder\n```\n\n### Renaming\n\ndrive allows you to rename a file/folder remotely.\nTwo arguments are required to rename ie `\u003crelativePath/To/source or Id\u003e` `\u003cnewName\u003e`.\n\nTo perform a rename:\n\n```shell\ndrive rename url_test url_test_results\ndrive rename openSrc/2015 2015-Contributions\n```\n\n+ Also supports renaming by fileId\n\n```shell\ndrive rename 0fM9rt0Yc9RTPeHRfRHRRU0dIY97 fluxing\n```\n\nTo turn off renaming locally or remotely, use flags\n`-local=false` or `-remote=false`. By default both are turned on.\n\nFor example\n\n```shell\ndrive rename -local=false -remote=true a/b/c/d/e/f flux\n```\n\n### Command Aliases\n\n`drive` supports a few aliases to make usage familiar to the utilities in your shell e.g:\n+ cp : copy\n+ ls : list \n+ mv : move\n+ rm : delete\n\n### Detecting And Fixing Clashes\n\nYou can deal with clashes by using command `drive clashes`.\n\n* To list clashes, you can do\n\n```shell\ndrive clashes [-depth n] [paths...]\ndrive clashes -list [-depth n] [paths...] # To be more explicit\n```\n\n* To fix clashes, you can do:\n\n```\ndrive clashes -fix [-fix-mode mode] [-depth n] [paths...]\n```\n\nThere are two available modes for `-fix-mode`:\n  * `rename`: this is the default behavior\n  * `trash`: trashing *both* new and old files\n\n## .desktop Files\n\nAs previously mentioned, Google Docs, Drawings, Presentations, Sheets etc and all files affiliated\nwith docs.google.com cannot be downloaded raw but only exported. Due to popular demand, Linux users\ndesire the ability to have \\*.desktop files that enable the file to be opened appropriately by an external opener.\nThus by default on Linux, drive will create \\*.desktop files for files that fall into this category.\n\nTo turn off this behavior, you can set flag `-desktop-links` to false e.g\n```shell\ndrive pull -desktop-links=false\n```\n\n### Fetching And Pruning Missing Index Files\n\n* index \n\nIf you would like to fetch missing index files for files that would otherwise not need any modifications, run:\n\n```shell\ndrive index path1 path2 path3/path3.1 # To fetch any missing indices in those paths\ndrive index -id 0CLu4lbUI9RTRM80k8EMoe5JQY2z\n```\n\nYou can also fetch specific files by prefix matches\n```shell\ndrive index -matches mp3 jpg\n```\n\n* prune\n\nIn case you might have deleted files remotely but never using drive, and feel like you have stale indices,\nrunning `drive index -prune` will search your entire indices dir for index files that do not exist remotely and remove those ones\n\n```shell\ndrive index -prune\n```\n\n* prune-and-index\nTo combine both operations (prune and then fetch) for indices:\n\n```shell\ndrive index -all-ops\n```\n\n### Drive server\n\nTo enable services like qr-code sharing, you'll need to have the server running that will serve content once invoked in a web browser to allow for resources to be accessed on another device e.g your mobile phone\n\n```shell\ngo get github.com/odeke-em/drive/drive-server \u0026\u0026 drive-server\ndrive-server\n```\n\nPre-requisites:\n  + DRIVE\\_SERVER\\_PUB\\_KEY\n  + DRIVE\\_SERVER\\_PRIV\\_KEY\n\nOptionally\n  + DRIVE\\_SERVER\\_PORT : default is 8010\n  + DRIVE\\_SERVER\\_HOST : default is localhost\n\nIf the above keys are not set in your env, you can do this\n\n```shell\nDRIVE_SERVER_PUB_KEY=\u003cpub_key\u003e DRIVE_SERVER_PRIV_KEY=\u003cpriv_key\u003e [DRIVE...] drive-server\n```\n\n### QR Code Share\n\nInstead of traditionally copying long links, drive can now allow you to share a link to a file by means of a QR code that is generated after a redirect through your web browser. \n\nFrom then on, you can use your mobile device or any other QR code reader to get to that file.\nIn order for this to run, you have to have the `drive-server` running\n\nAs long as the server is running on a known domain, then you can start the qr-link getting ie\n\n```shell\ndrive qr vines/kevin-hart.mp4 notes/caches.pdf\ndrive qr -address http://192.168.1.113:8010 books/newest.pdf maps/infoGraphic.png\ndrive qr -address https://my.server books/newest.pdf maps/infoGraphic.png\n```\n\nThat should open up a browser with the QR code that when scanned will open up the desired file.\n\n### About\n\nThe `about` command provides information about the program as well as that about\nyour Google Drive. Think of it as a hybrid between the `features` and `quota` commands.\n```shell\ndrive about\n```\n\nOR for detailed information\n```shell\ndrive about -features -quota\n```\n\n### Help\n\nRun the `help` command without any arguments to see information about the commands that are available:\n\n```shell\ndrive help\n```\n\nPass in the name of a command to get information about that specific command and the options that can be passed to it.\n\n```shell\ndrive help push\n```\n\nTo get help for all the commands\n```shell\ndrive help all\n```\n\n### Filing Issues\n\nIn case of any issue, you can file one by using command `issue` aka `report-issue` aka `report`.\nIt takes flags `-title` `-body` `-piped`.\n\n* If `-piped` is set, it expects to read the body from standard input.\n\nA successful issue-filing request will open up the project's issue tracker in your web browser.\n\n```\ndrive issue -title \"Can't open my file\" -body \"Drive trips out every time\"\ndrive report-issue -title \"Can't open my file\" -body \"Drive trips out every time\"\ncat bugReport.txt | drive issue -piped -title \"push: dump on pushing from this directory\"\n```\n\n### Revoking Account Access\n\nTo revoke OAuth Access of drive to your account, when logged in with your Google account, go to https://security.google.com/settings/security/permissions and revoke the desired permissions\n\n### Uninstalling\n\nTo remove `drive` from your computer, you'll need to take out:\n+ $GOPATH/bin/drive\n+ $GOPATH/src/github.com/odeke-em/drive\n+ $GOPATH/pkg/github.com/odeke-em/drive\n+ $GOPATH/pkg/github.com/odeke-em/drive.a\n\n* Also do not forget to revoke drive's access in case you need to uninstall it.\n\n## Applying Patches \nTo  apply patches of code e.g in the midst of bug fixes, you'll just need a little bit of git fiddling.\n\nFor example to patch your code with that on remote branch patch-1, you'll need to go into the source\ncode directory, fetch all content from the git remote, checkout the patch branch then run the go installation: something like this.\n\n```shell\ncd $GOPATH/src/github.com/odeke-em/drive\ngit fetch --all\ngit checkout patch-1\ngit pull origin patch-1\ngo get github.com/odeke-em/drive/cmd/drive\n```\n\n## Why Another Google Drive Client?\n\nBackground sync is not just hard, it is stupid. Here are my technical and philosophical rants about why it is not worth to implement:\n\n* Too racy. Data is shared between your remote resource, local disk and sometimes in your sync daemon's in-memory structs. Any party could touch a file at any time. It is hard to lock these actions. You end up working with multiple isolated copies of the same file and trying to determine which is the latest version that should be synced across different contexts.\n\n* It requires great scheduling to perform best with your existing environmental constraints. On the other hand, file attribute have an impact on the sync strategy. Large files block -- you wouldn't like to sit on and wait for a VM image to get synced before you can start working on a tiny text file.\n\n* It needs to read your mind to understand your priorities. Which file do you need most? It needs to read your mind to foresee your future actions. I'm editing a file, and saving the changes time to time. Why not to wait until I feel confident enough to commit the changes remotely?\n\n`drive` is not a sync daemon, it provides:\n\n* Upstreaming and downstreaming. Unlike a sync command, we provide pull and push actions. The user has the opportunity to decide what to do with their local copy and when they decide to. Make some changes, either push the file remotely or revert it to the remote version. You can perform these actions with user prompt:\n\n\t    echo \"hello\" \u003e hello.txt\n\t    drive push # pushes hello.txt to Google Drive\n\t    echo \"more text\" \u003e\u003e hello.txt\n\t    drive pull # overwrites the local changes with the remote version\n\n* Allowing to work with a specific file or directory, optionally not recursively. If you recently uploaded a large VM image to Google Drive, yet only a few text files are required for you to work, simply only push/pull the exact files you'd like to worth with:\n\n\t    echo \"hello\" \u003e hello.txt\n\t    drive push hello.txt # pushes only the specified file\n\t    drive pull path/to/a/b path2/to/c/d/e # pulls the remote directory recursively\n\n* Better I/O scheduling. One of the major goals is to provide better scheduling to improve upload/download times.\n\n* Possibility to support multiple accounts. Pull from or push to multiple Google Drive remotes. Possibility to support multiple backends. Why not to push to Dropbox or Box as well?\n\n## Known Issues\n\n* It probably doesn't work on Windows.\n* Google Drive allows a directory to contain files/directories with the same name. Client doesn't handle these cases yet. We don't recommend you to use `drive` if you have such files/directories to avoid data loss.\n* Racing conditions occur if remote is being modified while we're trying to update the file. Google Drive provides resource versioning with ETags, use Etags to avoid racy cases.\n* drive rejects reading from namedPipes because they could infinitely hang. See [issue #208](https://github.com/odeke-em/drive/issues/208).\n\n## Reaching Out\n\nDoing anything interesting with drive or want to share your favorite tips and tricks? Check out the [wiki](https://github.com/odeke-em/drive/wiki) and feel free to reach out with ideas for features or requests.\n\n## Disclaimer\n\nThis project is not supported nor maintained by Google.\n\n## LICENSE\n\nCopyright 2013 Google Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","funding_links":[],"categories":["Go","软件包","Software Packages","Go (134)","Go Tools","Go 工具","golang","命令行","cli","Command Line","Other Software","CLI Utilities","\u003cspan id=\"命令行-command-line\"\u003e命令行 Command Line\u003c/span\u003e"],"sub_categories":["其他软件库和软件包","Other Software","其他软件","Standard CLI","標準命令行交互","标准命令行交互","标准CLI"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodeke-em%2Fdrive","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fodeke-em%2Fdrive","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodeke-em%2Fdrive/lists"}