首页 > 解决方案 > 为什么 find piped to xargs mv 删除了我的文件?

问题描述

今天我经历了一件难以置信的事情。我的目标是将超过 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.

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

标签: linuxcentosxargsmv

解决方案


您是否提前创建了目录../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保持不变。


推荐阅读