将文件从子目录复制到一个目录

将文件从子目录复制到一个目录

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

/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

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

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

所以我的计划是首先将所有 2011-01-07 sql 文件复制到 tmp 目录中,例如

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

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

cp: 无法统计.....没有这样的文件或目录

所以你们能帮我解决这个问题吗?如果你能告诉我下一步怎么做,也就是用一个命令一次导入所有数据库,那就太好了,还有加分。

我确实想通过两个单独的步骤来完成这些操作,因为在运行恢复命令之前,我需要从 tmp 目录中手动删除一些 sql 文件。

所以我需要:

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

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

我知道可以一步完成,但出于很多原因,我真的更愿意分两步完成。

答案1

将所有 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

答案2

用来find找到它们然后一次性完成所有操作。

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

答案3

我做过类似的事情。在工作中,我编写了一个执行 for 循环的 bash 脚本 - 对于每个子目录,cd 进入该目录,将所有文件 cp 到单个目标目录,然后 cd 备份。

如果您有多个级别,您可以做得更花哨,每次找到子目录时, cd 进入并增加计数器。完成后, cd 备份并减少计数器。

您还可以使用 find ./-type -f 执行某些操作,然后将每个文件 cp 到目标目录中,同时(可能使用 sed)从目标参数中删除所有子目录名称。

答案4

这是一个很酷的方法:使用 find(1) 和 gnu平行线

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

find 命令查找与/backup/daily该名称字符串匹配的所有文件(类型 f)。然后将其通过管道传输到 parallel,parallel 将每个文件名提供给 mysql 命令行工具。/-print0组合-0通过以空值而不是空格结尾来确保没有奇怪的文件名或带空格的文件名会导致问题。但是,某些版本的 find 不支持此功能。告诉-j1parallel 一次执行一个作业,如果可以安全地将多个文件一次加载到 mysql 中,您可以增加该值。

这也回答了你的问题:如何用一个命令一次性完成所有操作。

相关内容