尝试在Linux中获取ADB命令(用于复制时间戳)以使用名称中的空格


2

使用Linux Mint 13,我一直试图通过USB将ADB复制文件和目录到连接的Android。需要保留时间戳。

(我知道在Unix中,仅存储修改时间)。

从Googling得到了一个命令,但了解得不多。链接在下面。 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复制文件名和目录中没有空格的时间戳。获取错误消息,例如。未知ID:R(带空格)。

我应该如何修改代码?


如果使用file="$(line)"代替read file"$file"则将包含任何前导或尾随空格(或其他字符,除了换行符)。如果没有的话line,可以使用等价的东西head -n 1。但是,你应该不会有"$file"adb电话吗?
AFH 2015年

通过以上内容浏览..仍然无法使其正常工作。试图找到。-print0 | 在读取文件时;我想我不知道足够的Linux命令来解决这个..
blue.grux

我认为问题可能是双重扩展:您的主机扩展了一次,adb外壳又扩展了。我仍然看不到该adb命令应该如何知道该touch命令应该作用在哪个文件上。或字符串有什么特别之处ANDROID_PHONE吗?过去,我将Android安装为USB驱动器,并且使用常规copy(cp --preserve=all)来维护时间戳,而无需诉诸adb。我现在使用Android中的文件管理应用程序通过WiFi复制,这也保留了它们。
AFH 2015年

嗨,AFH,谢谢您的答复。问题在于保留了文件的时间戳,但没有保留目录的时间戳,因此必须使用脚本/命令来“复制”时间戳。该脚本非常适合没有空格的文件夹或文件名。我从要比较的文件夹树的开头从Linux运行它,只需要编辑“ / sdcard / Download / $ file \”部分以反映要比较的Android路径。将Android挂载为USB驱动器需要USB Mass Storage,而新手机将不再具有USB Mass Storage。
blue.grux

如果touchAndroid上的命令应该是,touch -t $timestamp "/sdcard/ANDROID_PHONE/$file"那么我可以看到问题是双重扩展,但是如果没有,"$file"我将无法理解它应该如何工作。顺便说一句,我会注意到修改目录时间戳是不寻常的,因为每次创建,删除或重命名包含的文件或子目录时,它们都会更新。
AFH 2015年

Answers:


1

我可以解释其中的一部分:


find .用于列出当前路径(即点)中的所有文件和目录。没有告诉Find对结果做任何事情,但是大多数find实现的默认行为是将它们打印到std中。

正确的编码应该使用find /path/to/pictures -ls-print0。如果名称中包含非标准字符(例如空格),则最后一个很有用。

然后将先前命令的输出保存到下一部分。这是通过竖线(|)符号完成的。


下一个命令包装在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 \“”; DONE

这将从文件中读取(在我们的示例中为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中,并用引号引起来以避免空格问题。

然后将结果替换为格式不同的相同信息。

接下来,将此结果回显到标准输出。可能是因为这样,用户对脚本的位置有所了解。

最后,它使用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用于查找文件,然后将结果(包括空格)传递给Shell。Find可以自己做事。无需读取文件。一个find /path/to/files -exec "something" {} \;可能会更好更快地工作。

find <path> -exec <something> {} \;在许多情况下实际上要慢一些。那是因为它将<something>在每次迭代中开始。许多工具可以获取任意数量的输入文件,在这种情况下,执行files=$(find <path> -print) && <something> $files速度更快,因为它只启动<something>一次。
Gx1sptDTDa 2015年

真正。有时,您可以通过找到\ +解决该问题。
汉尼斯,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.