3 votos

Script para sacar del directorio que contiene espacios

Estoy tratando de sacar imágenes de Whatsup desde mi teléfono Android a través de ADB utilizando 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

¿Qué pasa?

2voto

Guillermo Gomez Puntos 423

Obtenga comillas dobles:

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

./adb pull "$DEVICE_DIR/$file" $HOST_DIR/;
           ^                 ^

Y eliminar los escapes de barra invertida:

DEVICE_DIR="/sdcard/WhatsApp/Media/WhatsApp Images"
                                           ^

0 votos

Gracias, eso ha servido. Ahora tengo un error diferente: adb: error: objeto remoto '/... /WhatsApp\ Images/IMG-20171031-WA0000.jpg' no existe. Pero puedo sacar un archivo a la vez, claramente existe.

0 votos

@Ivana Actualizado. Eliminar los escapes de barra invertida ya que es contraproducente en las cadenas entrecomilladas.

0 votos

@iBug Yo suelo poner `IFS=$' \n ' antes de jugar con los espacios, como para evitar dolores de cabeza. Es posible que quieras añadir esto en tu respuesta.

0voto

BenLanc Puntos 151

La respuesta de iBug resuelve el primer problema pero crea otro. El truco es omitir las comillas alrededor del nombre del directorio, y sólo añadirlas 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.

0 votos

IBug ya ha actualizado su respuesta - la tuya ahora causa cierta confusión, sobre todo porque estás mezclando las citas y los escapes. Como básicamente quieres decir lo mismo: ¿no estarías de acuerdo en que la respuesta de iBug es suficiente?

0voto

tester Puntos 1

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

archivos resultantes de la carpeta "Wi-fi Direct" copiados en la carpeta 1 del disco duro C

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X