変数出力に含まれるファイルの内容を置き換える方法

変数出力に含まれるファイルの内容を置き換える方法

変数構文やその他のコマンドを検索しましたが、渡すことはできません。

btrfsスナップショットを使用して作成されたフォルダがあります。各フォルダには名前付きファイル/etc/fstabがあり、そのファイルを編集して常にフォルダパスの値に置き換える必要があります。@たとえば、@snapshots/daily/root2020-12-27_19H05

ここの変数には2020-12-27_19H05常に接頭辞が付きますroot

ファイルの編集を始める前の最初のステップは、変数として見つかったすべてのフォルダにルートとしてファイルを生成する単純なbashスクリプトを作成するなどの簡単なタスクを実行することです。

cd /.snapshots/daily
SNAPSHOTS=$(ls -d root*/)
echo > $SNAPSHOTS/test

ただし、次のエラーが発生します。

bash: $SNAPSHOTS/test: ambiguous redirect

私が考えることができるすべての場所で ""、''、()、{}を使用してすべてを試しましたが、すべて失敗しました。いくつかの場所でSUDOを試してみましたが、やはり失敗しました。これはインターネットでよくあるようですが、私が読んだことのどれも私の問題を理解して解決できませんでした。

私は何が間違っていましたか?

ありがとうございます!

答え1

SNAPSHOTS複数のディレクトリを含めることができます。

set -xコマンドの前に行を挿入して問題を確認できますecho。が表示されます$SNAPSHOTS

ループを使用して、echo一致する各ディレクトリに対してコマンドを呼び出します。

for i in root*/
do
    if [ "$i" != 'root*/' ]
    then
        touch "$i"/test
    fi
done

一致するディレクトリがない場合、アドインはif実行されません。touch 'root*/test'

答え2

変数にSNAPSHOTSスペースが含まれています。その値にリダイレクトするには、二重引用符を使用してください。

echo > "$SNAPSHOTS"/test

SNAPSHOTS単一の文字列に複数の個別の文字列を格納することはできず、その単一の文字列から正しく検索できると考えているため、これは必要に応じて実行されない可能性があります。実際には配列でなければなりません。lsここでは全く必要ありません:

shopt -s nullglob

SNAPSHOTS=(root*/)

for snap in "${SNAPSHOTS[@]}"; do
    echo >"$snap"/test
done

そうでなければ

shopt -s nullglob

for snap in root*/; do 
    echo >"$snap"/test
done

シェルオプションを設定すると、nullglob一致するパターンがない場合はパターンが完全に削除されます。それ以外の場合、nullglob一致するものがない場合、パターンはそのまま残ります。

空の行を入れるファイルがたくさんない場合は、これを行うこともできます。

shopt -s nullglob

SNAPSHOTS=(root*/)
echo | tee "${SNAPSHOTS[@]/%//test}" >/dev/null

本当に欲しいなら作るファイルを作成し(空白行を書き込まないで)、次を使用しますtouch

shopt -s nullglob

SNAPSHOTS=(root*/)
touch "${SNAPSHOTS[@]/%//test}" 2>/dev/null

答え3

あなたはすべてを知っており、私たちが理解できるように答えを説明します。このウェブサイトは素晴らしいデータベースです。

ついに私が行った

for i in root*/
do
    if [ "$i" != 'root*/' ]
    then
        sudo touch "$i"/test
    fi
done

これらのスナップショットフォルダはルートが所有しているため、ここではsudoが使用されます。

これで、変数内に返されたフォルダリスト内のファイルの作成、名前変更、削除、権限の変更などの最初のステップを理解しました。

もう一歩進んで、変数が返した各フォルダのファイルを編集し、固定値を変数が最初に返した値と同じ変数値に置き換えました。

置き換えたい値に変数を組み込む方法を理解できません。

スクリプトを簡単にするためにスナップショット構造を変更しました。フォルダ内のすべてのフォルダを一覧表示する変数は、次を返します。

echo $SNAPSHOTS
2020-12-22_19H05/
2020-12-23_19H05/
2020-12-24_19H05/
2020-12-25_19H05/
2020-12-26_19H05/
2020-12-27_19H05/
2020-12-28_19H05/

2020-12-22_19H05/etc/fstab毎日ディレクトリの名前が変更されます(最も古いものが1日削除され、今日追加されます)、各フォルダには/ etc / fstabにファイルがあります。

ファイルを編集して固定値 "@home"を検索したら、固定プレフィックス文字列の変数値部分に置き換える必要があります。たとえば、次のようになります。

@snapshots/daily/home/$VARIABLE

$ VARIABLE = 上記の最初の変数から返されたディレクトリ名。

したがって、フォルダ内の2020-12-22_19H05/ファイルは、省略/切り捨てる必要があるファイルが最後にないファイルを/etc/fstab置き換えるように編集されます。最初の変数で見つかったすべてのフォルダについても同様です。@home@snapshots/daily/home/2020-12-22_19H05/

私はsedとおそらく%が使用されることを期待していますが、1回答を得るためにインターネット上で何を検索するのかわかりませんが、ほとんど2回答を理解しています。

ありがとうございます!

関連情報