Freebsd:シェルスクリプトを使用したポイントファイルのバックアップ

Freebsd:シェルスクリプトを使用したポイントファイルのバックアップ

ドットファイルをコピーするには、単純なシェルスクリプトが必要です。.サポート拡張、つまり.dotfile1.バックアップ。既存のバックアップに拡張機能を追加するのに時間がかかるため、以下のスクリプトは機能しません。.dotfile1.backup.backup

bkdot.sh

#!/bin/sh
for file in .*; do
    cp “./$file” “./$file.backup”
done

次のスクリプトはトリックを実行する必要があるようですが、何も起こりません。何が欠けていますか?

bkdot_revised.sh

#!/bin/sh
for file in .*; do
     if [ ! “./$file.backup” ]; then
         cp “./$file” “./$file.backup”
     fi
done

答え1

テストに[十分な情報がありません。$file参考資料と比較してください。現在の構成では、「xがこの文字列ではない場合」と呼ばれていますが、「xがこの文字列ではない場合」と言う必要があります。[[代わりに正規表現を使用します[

#!/bin/bash
GLOBIGNORE=.:..
for file in .*; do
     if [[ ! "$file" =~ \.backup$ ]]; then
         cp "$file" "$file.backup"
     fi
done
  • Kusalanandaのコメントに基づいて、ビルドが正しく機能していることを/bin/bash確認するためにshebangを移動しました。[[
  • Gordon Davidsonのコメントに基づいて、GLOBIGNOREスクリプトがコピーしようとしないように.追加します。..

その他:

  • ./パスには不要です。あなたはすでにこのディレクトリにいます!
  • これがコピー/貼り付けの問題であるかどうかはわかりませんが、代わりに問題があります"
  • 個人的には、私は他のディレクトリにコピーしてこれらの問題をすべて回避し、ホームディレクトリを汚染するのを防ぎます。実際、私はすべてを(増分的に)バックアップします!

これは純粋な/bin/shバージョンです。[[bashismを使う代わりにケース代わりに。

#!/bin/sh
GLOBIGNORE=.:..
for file in .*; do
  case "$file" in
    *.backup) ;;
    *) cp "$file" "$file.backup";;
  esac
done

答え2

演算子は!単にオペランドを否定するため、条件は常にと評価されますfalse-fたとえば、ファイルが存在する場合はtrueを返すいくつかのファイルテスト演算子があります。

しかし、正しく行っているかどうかはわかりません。存在しない場合は、バックアップを実行するだけでなく、既存のバックアップを常に上書きするのも安全ではありません。

これは可能です。

#!/bin/sh
for file in .*; do
     if [ ! -f "./${file}.backup" ]; then
         cp "./${file}" "./${file}.backup"
     fi
done

答え3

sed単にバックアップに使用するとどうでしょうか?

sed -i.bak 's#\n#\n#' <filepattern*>

答え4

予想される動作が次の場合:

  • 既存の点ファイルのコピーの作成
  • しかし、存在しない場合にのみ

その後、 find を使用できます。

gunhed@gstation:[~/test]0$ ls -la
insgesamt 2
drwxrwxr-x   2 gunhed gunhed 0 Dez 30 20:45 .
drwxr-x--- 100 gunhed gunhed 0 Dez 30 20:44 ..
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test2
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test3
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test4
gunhed@gstation:[~/test]0$ find . -maxdepth 1 -type f -regex "^.*[^.bak]$" -exec cp -vn {} {}.bak \;
'./.test4' -> './.test4.bak'
'./.test3' -> './.test3.bak'
'./.test' -> './.test.bak'
'./.test2' -> './.test2.bak'
gunhed@gstation:[~/test]0$ find . -maxdepth 1 -type f -regex "^.*[^.bak]$" -exec cp -vn {} {}.bak \;
gunhed@gstation:[~/test]0$ ls -la
insgesamt 4
drwxrwxr-x   2 gunhed gunhed 0 Dez 30 20:45 .
drwxr-x--- 100 gunhed gunhed 0 Dez 30 20:44 ..
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test2
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test2.bak
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test3
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test3.bak
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test4
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test4.bak
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test.bak
gunhed@gstation:[~/test]0$ 

以下を使用してオプションを見つけます。

  • .: 現在のディレクトリを開始点として使用
  • -maxlength:ここからサブディレクトリに移動しないでください。
  • -type f: 一般ファイルのみを検索
  • -regex "^.*[^.bak]$": "." で始まるが .​​bak で終わらないすべてのファイル名 (この例ではバックアップ拡張子)
  • -exec cp -vn:cp標準コピーコマンド、-nはオーバーライドされず、-vは詳細
  • {} {} .bak:findを介して現在見つかったファイル名に拡張

たぶんこれは別のオプションかもしれません。あまりにも神秘的ではないことを願っています。さまざまな状況で助けを求めます;-)

関連情報