Script para extraer del directorio que contiene espacios

Estoy tratando de extraer imágenes de Whatsup de mi teléfono Android a través de ADB usando el siguiente script:

HOST_DIR=/myImageDirectory
DEVICE_DIR="/sdcard/WhatsApp/Media/WhatsApp\ Images"
echo started
for file in $(./adb shell ls $DEVICE_DIR)
do
    file=$(echo -e $file | tr -d "\r\n"); # EOL fix
echo $file  
    ./adb pull $DEVICE_DIR/$file $HOST_DIR/;
done

El espacio en el directorio de origen se escapa con éxito para ls pero no para pull. Es decir, obtengo la lista de archivos pero no puedo extraerlos. Aquí hay 3 líneas de la salida:

IMG-20171101-WA0003.jpg
adb: error: remote object '/sdcard/WhatsApp/Media/WhatsApp\' does not exist
adb: error: remote object 'Images/IMG-20171101-WA0003.jpg' does not exist

¿Lo que da?

Respuestas (3)

Obtener comillas dobles:

for file in $(./adb shell ls \""$DEVICE_DIR"\")
                               ^           ^
./adb pull "$DEVICE_DIR/$file" $HOST_DIR/;
           ^                 ^

Y elimine los escapes de barra invertida:

DEVICE_DIR="/sdcard/WhatsApp/Media/WhatsApp Images"
                                           ^
¡Gracias, eso funcionó! Ahora recibo un error diferente: adb: error: el objeto remoto '/... /WhatsApp\ Images/IMG-20171031-WA0000.jpg' no existe. Pero puedo extraer un archivo a la vez, claramente existe.
@Ivana Actualizado. Elimine los escapes de barra invertida, ya que es contraproducente en las cadenas entre comillas.
@iBug Usualmente configuro `IFS=$'\n' antes de jugar con espacios, para evitar dolores de cabeza. Es posible que desee agregar esto en su respuesta.
@DeathMaskSalesman Pero yo mismo no estoy muy familiarizado con IFS...
@iBug Como confío en que sabe, IFSespecifica qué carácter interpreta el shell como separador. El carácter predeterminado es un espacio en blanco, lo que hace que el shell se entrecorte cuando hay espacios en blanco dentro de las rutas. IFS='\n'le dice al shell que trate una nueva línea como el separador, de modo que uno pueda entrometerse con seguridad en el tipo de rutas mencionadas anteriormente.

La respuesta de iBug resuelve el primer problema pero crea otro. El truco es omitir las comillas alrededor del nombre del directorio y solo agregarlas alrededor de la variable del directorio, así:

HOST_DIR=/myImageDirectory
DEVICE_DIR="/sdcard/WhatsApp/Media/WhatsApp\ Images"
DEVICE_DIR_noescape=/sdcard/WhatsApp/Media/WhatsApp\ Images
echo started
for file in $(./adb shell ls $DEVICE_DIR)
do
    file=$(echo -e $file | tr -d "\r\n"); # EOL fix
    echo $file  
    ./adb pull "$DEVICE_DIR_noescape/$file" $HOST_DIR/;
done

Y sí necesito limpiar el código, pero esto funciona.

iBug ya ha actualizado su respuesta; la tuya ahora causa cierta confusión, especialmente porque estás mezclando citas y escapes. Como básicamente quiere decir lo mismo: ¿no estaría de acuerdo con que la respuesta de iBug es suficiente?

para el comando ADB (no shell) antes y después de la entrada SPACE " ejemplo adb pull /sdcard/Wi-Fi" "Directo /C:/1/

archivos de resultados de la carpeta "Wi-Fi Direct" copiados a la carpeta 1 en el disco duro C