将子目录中的文件复制到一个目录中

好吧,我有一堆这种文件结构格式的文件。

/backup/daily/database1/database1-2011-01-01.sql /backup/daily/database1/database1-2011-01-02.sql /backup/daily/database1/database1-2011-01-03.sql /backup/daily/database1/database1-2011-01-04.sql /backup/daily/database1/database1-2011-01-05.sql /backup/daily/database1/database1-2011-01-06.sql /backup/daily/database1/database1-2011-01-07.sql /backup/daily/anotherdb/anotherdb-2011-01-01.sql /backup/daily/anotherdb/anotherdb-2011-01-02.sql /backup/daily/anotherdb/anotherdb-2011-01-03.sql /backup/daily/anotherdb/anotherdb-2011-01-04.sql /backup/daily/anotherdb/anotherdb-2011-01-05.sql /backup/daily/anotherdb/anotherdb-2011-01-06.sql /backup/daily/anotherdb/anotherdb-2011-01-07.sql /backup/daily/stuff/stuff-2011-01-01.sql /backup/daily/stuff/stuff-2011-01-02.sql /backup/daily/stuff/stuff-2011-01-03.sql /backup/daily/stuff/stuff-2011-01-04.sql /backup/daily/stuff/stuff-2011-01-05.sql /backup/daily/stuff/stuff-2011-01-06.sql /backup/daily/stuff/stuff-2011-01-07.sql 

还有很多很多

最终我想导入所有2011-01-07.sql文件到我的mysql数据库。

这适用于一个

 mysql -u root -ppassword < /backup/daily/database1/database1-2011-01-07.sql 

这将很好地从这个备份文件恢复该数据库。

我想运行一个进程,它为所有数据库执行此操作。

所以我的计划是首先将所有的cp文件转换成tmp目录

 cp /backup/daily/*/*2011-01-07*.sql /tmp/all 

上面的命令不起作用我得到一个错误:

CP:不能统计…..没有这样的文件或目录

所以你们可以帮我解决这个问题。 对于奖励点,如果你能告诉我如何做下一个步骤,即一次一个地执行一个命令导入所有的数据库,那也是很棒的。

我真的想在两个单独的步骤中完成这些工作,因为我需要在运行restore命令之前从tmp目录中手动删除一些sql文件。

所以我需要:

1)命令将所有2011-01-07 sql文件复制到tmp目录

2)命令将该目录中的所有文件导入到mysql中

我知道它可能在一个,但有很多原因,我真的希望分两步做。

要将所有2011-01-07 sql文件复制到临时目录(/ tmp / all作为每个问题)

 find /backup/daily -name '*-2011-01-07.sql' -exec cp -t /tmp/all {} + 

导入

 #!/bin/bash for FILE in $( ls /tmp/all/*-2011-01-07.sql ) do echo "Importing $FILE ... " mysql -u root -ppassword < "$FILE" && echo "OK" done 

使用find来find它们,然后一次完成。

 find /backup/daily -name '*-2011-01-07.sql' -exec cat {} + | mysql -u root -p 

我做了类似的事情。 在工作中,我做了一个bash脚本来做一个for循环 – 对于每个子目录,cd到它,cp所有文件到单个目标目录,然后cd备份。

如果你有多个级别的话,你可能会变得更加奇特,每次你find一个子目录的时候,就进入并增加一个计数器。 完成后,cd备份并减less计数器。

你也可以用find ./ -type -f做一些事情,然后把每个文件的一个cp文件放到目标目录中,同时(可能用sed)去掉目标参数中的所有子目录名称。

下面是一个很酷的方法:使用find(1)和gnu parallel :

 find /backup/daily -type f -name \*2011-01-07\.*.sql -print0 | parallel -0 -j1 'mysql -u root -ppassword < {}' 

find命令查找/backup/daily与该名称string匹配的所有文件(typesf)。 然后你pipe它并行,它将每个文件名喂给mysql命令行工具。 -print0 / -0组合可以确保没有奇怪的文件名或带空格的文件名会导致问题,通过终止而不是空格。 然而,某些版本的find不支持这个。 -j1并行执行一个作业,如果可以安全地将多个文件一次加载到mysql,则可以增加该作业。

这也回答了你如何一次完成一个命令的问题。