【问题标题】:Why find piped to xargs mv deleted my files?为什么 find piped to xargs mv 删除了我的文件?
【发布时间】:2021-01-13 19:43:12
【问题描述】:

今天我经历了令人难以置信的事情。我的目标是将超过 7 天的文件 mv 到另一个目录。目录存在。 我使用了命令:

find ./* -newermt $(date +%Y-%m-%d -d '7 day ago') -type f -print | xargs -I '{}' mv {} ../update_error_handled

然后,令人难以置信的文件不见了,我去了使用ls -lA 的文件夹并没有找到我移动的任何文件。发生了什么? CentOS 7.0,没有目录挂载,原始文件丢失,尝试grep -r "content" / - 什么也没找到...... .

那么为什么它会这样呢?

在我启动之前 find ./* -newermt $(date +%Y-%m-%d -d '7 day ago') -type f -print 它返回了:

 ./file66.xml
 ./file67.xml 
...etc.

以这种方式丢失数据真的很糟糕。 澄清一下:目录在移动文件之前就已经存在。目录不包含我今天尝试移动的文件,只包含较旧的文件。

【问题讨论】:

  • 如果您想确定mv 将最后一个参数视为目录,请附加/.。示例:mv a b c d/.
  • @ceving 谢谢你的建议!将/(斜线)与/.(斜线点)附加到目录名称的优缺点是什么?两者似乎都比不附加任何东西更安全,但斜线点稍长,所以我更喜欢简单的斜线:d/ 而不是d/.
  • 任何可能的拼写错误,例如某处的多余空间,例如,目的地是. ./update_error_handled?
  • @TimurShtatland d 是文件或目录,d/. 始终是目录。 d/ 介于两者之间,需要稍微解释一下。但它也可能有效。

标签: linux centos xargs mv


【解决方案1】:

您是否提前在../update_error_handled 创建了一个目录? 如果不是,那么您从文件中剩下的所有内容将是最后一个,称为../update_error_handled

为了避免此类错误,我总是通过在目标目录名称末尾添加/. 来确保目标目录存在。

不安全的方法:

$ rm -rf file dest_dir
$ touch file
$ ls -ld file dest_dir
ls: cannot access 'dest_dir': No such file or directory
-rw-rw-r--. 1 u u 0 Sep 28 11:53 file
$ mv file dest_dir
$ ls -ld file dest_dir
ls: cannot access 'file': No such file or directory
-rw-rw-r--. 1 u u 0 Sep 28 11:53 dest_dir

使用不安全的方法,file 被重命名为一个名为 dest_dir 的文件。

安全方法:

$ rm -rf file dest_dir
$ touch file
$ ls -ld file dest_dir
ls: cannot access 'dest_dir': No such file or directory
-rw-rw-r--. 1 u u 0 Sep 28 11:54 file
$ mv file dest_dir/.
mv: cannot move 'file' to 'dest_dir/.': No such file or directory
$ ls -ld file dest_dir
ls: cannot access 'dest_dir': No such file or directory
-rw-rw-r--. 1 u u 0 Sep 28 11:54 file

使用安全方法,mv 命令失败,文件file 保持不变。

【讨论】:

  • 嗯,目录是事先存在的。
  • @Fksjii 在这种情况下,这个问题是不可重现的,我很难相信任何人都能提供帮助
猜你喜欢
  • 2016-03-15
  • 2013-08-20
  • 2017-08-07
  • 1970-01-01
  • 2013-01-09
  • 2011-08-02
  • 2014-08-08
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多