Ich habe dazu ein kleines Skript geschrieben, das Dateien nach dem Abrufen vom Gerät löscht:
#!/bin/sh
cleanup() {
[[ -n "$dest" ]] && cd "$OLDPWD" && rmdir --ignore-fail-on-non-empty "$dest"
}
trap cleanup EXIT
DIRS=( /storage/emulated/0/DCIM/Camera
/storage/emulated/0/Pictures/Office\ Lens )
dest=$(mktemp -d -p .) && cd $dest
echo output directory: $(pwd)
for dir in "${DIRS[@]}"
do
echo downloading from $dir
adb shell ls "'$dir'/*.jpg" 2>/dev/null | xargs -I{} -n 1 -d '\n' sh -c 'adb pull -a "$1" && adb shell rm "\"$1\"" && adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d \"file://$1\" || exit 255' -- {} || break
done
Der Hauptprozess ist eine Schleife, die einmal für jedes $dir
angegebene Verzeichnis ausgeführt wird und $DIRS
beim ersten Fehler endet.
Die break
Verhindert die Verarbeitung im Fall eines Fehlers , so dass das Script beendet auf dem ersten Fehler.
Die Schleife führt einen zusammengesetzten Befehl für jedes Verzeichnis aus, das in $DIRS
als aufgeführt ist $dir
. Das erste Stück ist unkompliziert:
ls "'$dir'/*.jpg" 2>/dev/null
Es macht das, was es verspricht - listet alle JPEG-Dateien auf, die sich unter befinden $dir
. Das 2>/dev/null
verbirgt die No such file or directory
Fehlermeldung, die sonst angezeigt würde, wenn keine solchen Dateien vorhanden wären.
Die Ausgabe von ls
wird weitergeleitet in xargs
- die Argumente, die {}
als Platzhalter, \n
als Trennzeichen festgelegt sind, und verarbeitet Dateien nacheinander. Die Befehlszeile zur Verarbeitung jeder Datei lautet wie folgt:
sh -c 'adb pull -a "$1" && adb shell rm "\"$1\"" && adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d \"file://$1\" || exit 255' -- {}
Dies ist selbst ein zusammengesetzter Befehl aus drei adb
Befehlen, die von einer sh
Shell ausgeführt werden , die die Datei als Argument ( $1
) erhält, das durch ihren {}
Platzhalter angegeben wird .
Der erste Befehl lädt die Datei herunter:
adb pull -a "$1"
Wenn dies erfolgreich ist, entfernt der zweite Befehl die Datei vom Android-Gerät:
adb shell rm "\"$1\""
Das zusätzliche Anführungszeichen ist erforderlich, damit Dateinamen, die Leerzeichen enthalten, ordnungsgemäß an das übergeben werden adb shell
. Wenn dieser Befehl erfolgreich ist, teilt der letzte Befehl dem Gerät mit, dass die Datei nicht mehr vorhanden ist:
adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d \"file://$1\"
Es wird erneut ein Angebot beantragt adb shell
. Dieser Schritt ist erforderlich, um die in der Galerie- App aufgelisteten Bilder zu aktualisieren (andernfalls werden sie möglicherweise zwischengespeichert und weiterhin angezeigt).
Der zusammengesetzte Befehl endet mit exit 255
dem Fall, dass einer der adb
Befehle fehlschlägt. Dies hat eine besondere Bedeutung xargs
und führt dazu, dass es beendet wird, ohne dass weitere Dateien verarbeitet werden.
Dies ist ein schnelles und schmutziges Skript - es könnte wahrscheinlich verbessert werden, aber hoffentlich ist es hilfreich, wie es ist.