2

Используя Linux Mint 13, я пытался ADB скопировать файлы и каталоги на подключенный Android через USB. Необходимо сохранить временные метки.

(Я знаю, что в Unix хранится только измененное время).

Получил команду от Google, но не очень понимаю. Ссылка ниже. https://android.stackexchange.com/questions/35580/how-can-i-transfer-photos-to-my-android-jelly-bean-device-while-preserving-the-o

После нажатия кнопки adb "FROM" "ANDROID_PHONE" я использую команду ниже:

find . | while read file; do timestamp_stat=$(stat -c "%y" "$file"); timestamp=$(date +"%Y%m%d.%H%M%S" -d "$timestamp_stat"); echo "$timestamp: $file"; adb shell su -c "touch -t $timestamp \"/sdcard/ANDROID_PHONE\""; done

Я понимаю, что приведенной выше команде удается только использовать Touch для копирования меток времени для имен файлов и каталогов без пробелов в них. Получить сообщения об ошибках, например. Неизвестный идентификатор: R для тех, кто с пробелами.

Как я должен изменить код?

1 ответ1

1

Я могу объяснить часть этого:


find . используется для перечисления всех файлов и каталогов по текущему пути (это точка). Find не сказано ничего делать с результатами, но поведение по умолчанию в большинстве реализаций find заключается в том, чтобы выводить их в стандартный вывод.

Для правильного кодирования использовалась бы команда find /path/to/pictures -ls или -print0 . Последний полезен, когда в имени есть нестандартные символы (например, пробелы).

Вывод нами предыдущей команды затем передается следующей части. Это делается через символ канала (|).


Следующая команда заключена в цикл while (выделено жирным шрифтом)

во время чтения файла; do timestamp_stat = $(stat -c "% y" "$ file"); отметка времени = $(дата +"% Y% m% d.% H% M% S "-d" $ timestamp_stat "); эхо" $ timestamp: $ file "; оболочка adb su -c" touch -t $ timestamp \"/sdcard/ANDROID_PHONE \" "; сделано

Это читает из файла (в нашем случае из stdin, который содержит выходные данные предыдущей команды). Результаты чтения хранятся в переменной с именем file.

(находит -> находит вывод | -> ввод для цикла while)


Для каждого из этих результатов следующий набор команд выполняется в последовательности:

timestamp_stat=$(stat -c "%y" "$file");
timestamp=$(date +"%Y%m%d.%H%M%S" -d "$timestamp_stat"); 
echo "$timestamp: $file"; 
adb shell su -c "touch -t $timestamp \"/sdcard/ANDROID_PHONE\""; 

Переменная временная метка создана и заполнена результатами из stat -c
(stat - утилита, отображающая информацию о файле, на который указывает файл. В этом случае файл, на который он указывает, хранится в $ file и помещается в кавычки, чтобы избежать проблем с пробелами.

Затем результаты заменяются той же информацией в другом формате.

Следующий результат - echo'd для std out. Это, вероятно, так что пользователь имеет некоторое представление о том, где находится скрипт.

Наконец, он делает что-то с abd, с которым у меня нет надежной информации. Я думаю, это поручает телефону Android коснуться файла. Касание файла обычно изменяет дату файла на текущее время. Однако в этом случае указывается время установки файла.

С сенсорной страницы:

-t      Change the access and modification times to the specified time
        instead of the current time of day.  The argument is of the form
         ``[[CC]YY]MMDDhhmm[.SS]'' where each pair of letters represents
         the following:


Переходя к решению:

К сожалению, не здесь, только намеки:

  • Изменить IFS
  • Или используйте -print0 (и возможно с xargs -0)
  • Используйте переместить вещь в поиск. Прямо сейчас find используется для поиска файлов, и результаты (включая пробелы) затем передаются в оболочку. Find может делать вещи самостоятельно, хотя. Нет пока readfile нужен. find /path/to/files -exec "something" {} \; может работать лучше и быстрее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .