经常讨论,但不幸的是答案并没有让我找到解决方案,我有点惭愧我需要再次提出这个问题。但是,我们还是来了。
dosomething.sh
我有一个带有 shebang 的shell 脚本#!/bin/bash
。
在此脚本中,我使用以下行将某种类型的文件从一个目录复制到另一个目录:
find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;
执行脚本时,不会复制任何内容。我确信这只是我遗漏的一件小事。问题是:什么?
问题本身可能看起来很广泛,但请注意,我已经发布了自己的答案来解决这个问题。我认为这个案例研究具有足够的教育价值,可以对社区有用。
答案1
感谢评论者,我终于解决了这个问题。这是我之前回答的编辑版本,因为我发现它根本不充分,而且提出的问题比回答的问题还多。
因此,我在这里尝试描述导致问题本身的每个问题以及我如何解决它。
尝试#1:-mv
语法错误?
从脚本来看,以下行没有执行任何操作:
find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;
我不确定是否可以mv
在从 调用它时使用的标准参数-exec
,但-f
无论如何我添加了参数来覆盖目标目录中的现有文件。
按照建议将 添加set -x
到脚本中后,它返回一条错误消息,说命令的参数有问题mv
。所以我删除了该-f
参数。没有成功。在谷歌上搜索了一段时间后,我看到一些示例都使用了该-t
参数,所以我添加了它。同样,没有成功,相反,我收到一条错误消息,说需要一个目录,但我理解错了(抱歉,在编写 shell 脚本方面我是菜鸟)。此时我有以下语法,后来发现它完全正确并且有效:
find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /media/pi/MOBIDICDATA \;
(请注意移动的{}
)。但目前问题仍未解决,我甚至不确定-f
和是否-t
是其中的一部分。
尝试#2:- 我是否尝试写入以只读方式安装的 USB 驱动器?
您可能已经注意到,目标文件夹是,/media/pi/…
因此您可能知道我正在使用 Raspberry Pi 并且使用的是 Raspbian。我想要写入数据的 USB 棒会自动安装到此文件夹(只要设备名为)。MOBIDICDATA
自动安装将设备安装为只读(此时我不知道为什么)。这导致执行该过程,但没有复制任何文件,并出现一条错误消息,提示设备是只读的。
我决定不依赖自动挂载,而是在重启时自行将设备挂载到另一个位置。新目标是/mobidicdata
。设备已成功挂载,但由于某种原因仍然是只读的。
尝试#3:- 生命是否太短暂,无法安全移除 USB?
过去,我曾通过安全地从 Windows PC 上移除 2 个 USB 设备而导致设备损坏,所以我决定不再这样做,因为我从未通过拔出设备而导致设备损坏。我几乎不知道,例如,USB 记忆棒,被简单地拔出总是在大多数非 Windows 系统上,USB 设备以只读方式挂载;这完全合情合理,因为文件系统可能已损坏并导致其他问题。了解这一点后,我安全地移除了 USB 设备,然后挂载了它,现在它就是只读/写。
因此,使用可写设备和以下语法再次测试:
find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /mobidicdata \;
…正在发挥作用。
对我来说,这有点像一次奥德赛之旅。
概括
是的,正如前面提到的, -t
/-f
参数不是问题所在。它更像是一个多重问题集群,我早就应该更详细地描述一下了。
我希望能够阐明整个事情以及我现在所知道的事情以及将来会做的事情:
- 你绝对应该安全地移除 USB
不幸的是,我无法完全重现上述问题。在这种情况下,我可以说出确切的错误消息。但我仍然认为这可以让你更深入地了解发生了什么以及做了什么。