web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルに行を追加する方法は?

backupというディレクトリにファイル拡張子*.sqlを付けています。私がやりたいことは、ディレクトリbackup内のすべてのSQLファイルに行を追加することです。

echo 'use my_db;' >> backup/*.sqlを行いましたが、うまくいきませんでした。

私は以下を試しましたが、次に何をすべきかわかりません:

ls backup/*.sql | xargs echo "use my_db;"

その行を追加する解決策はありますか?

7
ALH

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

これにより、backup内の各.sqlファイルのインプレース編集が行われます。編集コマンドは、各ファイルの最初の行の前に行を挿入します。

これは、パターン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番目のコマンドはファイルを変更しません。

14
Kusalananda

解決

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

説明

sed -i変更をファイルに保存し、stdoutに書き込まないでください。

1-sedが最初の行にある場合。

i-次の行を挿入します。

backup/*.sqlsedが実行するファイル。

6
Iskustvo