変数構文やその他のコマンドを検索しましたが、渡すことはできません。
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回答を理解しています。
ありがとうございます!