好的,我是ubuntu的新手。我有200,000个文件需要通过,并存档30天内未更新的文件。
find . -type f -mtime +30
完成。
然后我需要将它们复制到一个位置,同时保持它们的目录结构超过当前./这是因为文件结构是每个文件唯一性的一部分。我可能有200个名为sum的文件但是FunRun / Sum和Smoke / Sum是两个不同的东西。
find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \;
完成。但是这并没有删除它们......那么mv是一个带删除的cp。但MV没有 - 父母转换。
所以我试过
find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; && rm
for file in 'find . -type f -mtime +30' do sudo cp $file --parents '{}' /home/me/backup \; && sudo rm $file; done
不行。所以我正在玩创建文件列表并像旧学校批处理文件一样使用它。问题是列表需要很长时间才能生成,我想自动完成此过程。所以我搜索并测试没有任何工作。因此,单行bash脚本是一个失败的原因,需要编写一个python脚本来执行它,或者你们可以提供帮助。所以我想我会在这里问一下,看看周末是如何进行的,并在星期一进行测试。
感谢您的帮助。
答案 0 :(得分:1)
你正在做的大部分事情看起来像猎枪调试尝试 - 只是改变随机事物而不知道它们的意思。您应该仔细阅读find
上的教程,也可以阅读关于bash脚本的教程。
无论如何,您可以在单个find
命令上串联多个操作。如果您愿意,甚至可以执行多个-exec
操作。所以:
find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; -exec rm '{}' \;
或者更简单:
find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; -delete
或者,当然,您可以编写自己的两行shell脚本,使用其所有参数调用cp --parents
,然后使用除最后一个参数之外的所有参数调用rm
,并且仅{{1那个。
如果你想进行-exec
循环,你可以做到这一点......虽然for
可能比逐个进行更有意义,但让我们按照你的方式尝试:
xargs
;单引号标记文字字符串。如果要将字符串作为命令执行并获得结果,则需要反引号。或者,更好,find
。$(…)
循环在for
之前需要分号。do
,这不在您的sudo
命令中,所以我怀疑您是否也想要它。find
是一个坏主意。$file
和'{}'
会将文字\;
和{}
字符串传递给;
。因此,您要求它将cp
,$file
和{}
复制到/home/me/backup
。这没有任何意义。 ;
命令对这些内容有特殊用途,但find
没有。如果您使用cp
尝试传递文件名,那么您已经使用'{}'
进行了此操作。所以:
$file