我有一个名为backup
文件扩展名的目录*.sql
。我想要做的事情是在目录中的所有 sql 文件前面添加一行backup
。
我做了echo 'use my_db;' >> backup/*.sql
,但没有成功。
我尝试了以下操作,但不知道下一步该怎么做:
ls backup/*.sql | xargs echo "use my_db;"
有什么解决方案可以在前面添加该行吗?
答案1
使用 GNU sed
:
for sql in backup/*.sql; do
sed -i '1i\use my_db;' "$sql"
done
与标准sed
:
for sql in backup/*.sql; do
sed '1i\
use my_db;
' "$sql" >"$sql.bak" && mv "$sql.bak" "$sql"
done
.sql
这将对中的每个文件进行就地编辑backup
。编辑命令在每个文件的第一行之前插入一行。
这假设该模式backup/*.sql
仅与您要编辑的文件匹配。
使用echo
和cat
:
for sql in backup/*.sql; do
{ echo 'use my_db;'; cat "$sql"; } >"$sql.tmp" && mv "$sql.tmp" "$sql"
done
在此循环中,我们首先输出要添加到文件中的行,然后输出文件的内容。这将进入一个临时文件,然后被重命名。
命令
echo 'use my_db;' >> backup/*.sql
会扩展到类似的东西
echo 'use my_db;' >> backup/file1.sql backup/file2.sql backup/file3.sql
这与以下相同
echo 'use my_db;' backup/file2.sql backup/file3.sql >> backup/file1.sql
这会将给定的字符串附加到backup/file1.sql
.
您的第二个命令不会修改任何文件。
答案2
解决方案
sed -i '1 i\use my_db' backup/*.sql
解释
sed -i
将更改保留在文件中,不要将其写入stdout
.
1
- 当sed
位于第一行时。
i
- 插入以下行。
backup/*.sql
将执行的文件sed
。
答案3
您可以迭代该文件夹中的每个文件。
for item in $(ls backup/ | grep "*.sql")
do
echo "use my_db;" >> $item
done