使用 Linux Mint 13,我一直在尝试通过 ADB 将文件和目录复制到通过 USB 连接的 Android。需要保留时间戳。
(我知道在 Unix 中只存储了修改时间)。
从 Google 上找到了一个命令,但不太明白。链接如下。 https://android.stackexchange.com/questions/35580/how-can-i-transfer-photos-to-my-android-jelly-bean-device-while-preserving-the-o
在 adb push "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 复制不带空格的文件名和目录的时间戳。对于带空格的文件名和目录,会收到错误消息,例如 Unknown id: R。
我该如何修改代码?
答案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\"";完毕
这将从文件(在我们的例子中是从 stdin 读取,其中包含上一个命令的输出)中读取。读取的结果存储在名为文件。
(查找 -> find 的输出 | --> 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 中并用引号括起来以避免出现空格问题。
然后用不同格式的相同信息替换结果。
接下来,结果被回显到 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 用于查找文件,然后将结果(包括空格)传递给 shell。不过 find 可以自行执行操作。不需要 readfile。a
find /path/to/files -exec "something" {} \;
可能工作得更好更快。