dropbox / dbxcli

A command line client for Dropbox built using the Go SDK
Other
1.04k stars 102 forks source link

upload / download folders #182

Open helenhuangmath opened 2 years ago

helenhuangmath commented 2 years ago

Hi dropbox team, Does dbxcli support folder uploading or downloading now? What command should I use for folder operation? Thank you!

conphi commented 2 years ago

dbxcli ls -l "path/to/folder/to/download"|awk -F"ago" '{print $2}'|sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'|xargs -I{} dbxcli get {} .

lumosideas commented 2 years ago

dbxcli ls -l "path/to/folder/to/download"|awk -F"ago" '{print $2}'|sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'|xargs -I{} dbxcli get {} .

Hi, this command is to download a directory, what about upload put a full directory to dropbox?

Thank you

lpares12 commented 1 year ago

@lumosideas did you manage to do it?

lumosideas commented 1 year ago

Hi, no, I have not receive answers to my question so I decide to use this script:

https://github.com/andreafabrizi/Dropbox-Uploader

However, I'm looking forward for an answer here.

tashrifbillah commented 7 months ago

dbxcli ls -l "path/to/folder/to/download"|awk -F"ago" '{print $2}'|sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'|xargs -I{} dbxcli get {} .

This command won't work for two-level deep folders. cc @conphi

jmgirard commented 5 months ago

In case anyone wants to adapt this to Powershell on windows:

./dbxcli ls -l "/path/to/folder/to/download" | ForEach-Object { $_ -split 'ago' | Select-Object -Index 1 } | ForEach-Object { $_.Trim() } | ForEach-Object { ./dbxcli get $_ . }
  1. Lists files in the specified directory using ./dbxcli ls -l.
  2. For each line of the output, splits the line at the string 'ago' and selects the second part (Select-Object -Index 1).
  3. Trims leading and trailing whitespaces from each result.
  4. Calls ./dbxcli get for each result.
gprabaha commented 5 months ago

Dropbox does not let you compress and download large files through the web browser, and the desktop client cannot be used practically to sync up with an external hard drive. I recently had to write a bash script using dbxcli which downloads directories and subdirectories and recreates the directory structure locally. Seemed relevant to this conversation

#!/bin/bash

# Function to create a directory if it doesn't exist
ensure_directory() {
  local path="$1"
  if [ ! -d "$path" ]; then
    mkdir -p "$path"
  fi
}

# Function to download files and replicate directory structure
download_files() {
  local path="$1"
  local destination="$2"
  local top_name="${path##*/}"
  local local_dest_path="$destination/$top_name"
  local depth="$3"
  local tabs=""
  for ((i=0; i<depth; i++)); do
    tabs+="    "
  done

  # Check if the item is not a file (does not contain a dot in the filename)
  if [[ "$path" != *.* ]]; then
    ensure_directory "$local_dest_path"
    echo -e "${tabs}Folder: $top_name"

    # Get the total number of items in the directory without leading whitespaces
    local total_items=$(dbxcli ls -l "$path" 2>/dev/null | awk 'NR>1 {print $NF}' | wc -l | awk '{$1=$1};1')
    local current_item=1
    tabs+="    "
    # Iterate over items in the directory
    dbxcli ls -l "$path" | awk 'NR>1 {print $NF}' | while read -r item; do
      local local_name="${item##*/}"
      echo -e "${tabs}Item $current_item of $total_items"
      local new_depth=$((depth+1))
      download_files "$item" "$local_dest_path" "$new_depth"
      ((current_item++))
    done
  else
    # If it's a file (contains a dot), use dbxcli get (output silenced)
    echo -e "${tabs}Downloading: $top_name"
    dbxcli get "$path" "$local_dest_path" > /dev/null 2>&1
  fi
}

# Download files and replicate directory structure
download_files "$1" "$2" "$3"

echo "Download completed."