如何在目录中的所有文件前添加一行?

Ali*_*eza 9 sed printf

我有一个名为backup文件扩展名的目录*.sql。我想要做的是在目录中的所有 sql 文件前添加一行backup

我做了echo 'use my_db;' >> backup/*.sql,这没有用。

我尝试了以下但不知道下一步该怎么做:

ls backup/*.sql | xargs echo "use my_db;"
Run Code Online (Sandbox Code Playgroud)

任何解决方案要前置一个行?

Kus*_*nda 18

使用 GNU sed

for sql in backup/*.sql; do
    sed -i '1i\use my_db;' "$sql"
done
Run Code Online (Sandbox Code Playgroud)

标准sed

for sql in backup/*.sql; do
    sed '1i\
use my_db;
' "$sql" >"$sql.bak" && mv "$sql.bak" "$sql"
done
Run Code Online (Sandbox Code Playgroud)

这将对中的每个.sql文件进行就地编辑backup。编辑命令在每个文件的第一行之前插入一行。

这假设该模式backup/*.sql仅与您要编辑的文件匹配。


使用echocat

for sql in backup/*.sql; do
    { echo 'use my_db;'; cat "$sql"; } >"$sql.tmp" && mv "$sql.tmp" "$sql"
done
Run Code Online (Sandbox Code Playgroud)

在这个循环中,我们首先输出我们想要添加到文件的行,然后是文件的内容。这进入一个临时文件,然后重命名。


命令

echo 'use my_db;' >> backup/*.sql
Run Code Online (Sandbox Code Playgroud)

会扩展到类似的东西

echo 'use my_db;' >> backup/file1.sql backup/file2.sql backup/file3.sql
Run Code Online (Sandbox Code Playgroud)

这与

echo 'use my_db;' backup/file2.sql backup/file3.sql >> backup/file1.sql
Run Code Online (Sandbox Code Playgroud)

这会将给定的字符串附加到backup/file1.sql.

你的第二个命令不会修改任何文件。

  • IIRC `-i` 暗示 GNU sed 中的 `-s` - 因此应该可以跳过循环并只执行 `sed -i '1i\user mydb' backup/*.sql`(尽管有 `ARG_MAX`) (5认同)

Isk*_*tvo 11

解决方案

sed -i '1 i\use my_db' backup/*.sql

解释

sed -i保留文件中的更改,不要将它们写入stdout.

1- Whensed位于第一行。

i - 插入以下行。

backup/*.sqlsed将执行的文件。