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

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

使用 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。afind /path/to/files -exec "something" {} \;可能工作得更好更快。

相关内容