ドットファイルをコピーするには、単純なシェルスクリプトが必要です。.サポート拡張、つまり.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を介して現在見つかったファイル名に拡張
たぶんこれは別のオプションかもしれません。あまりにも神秘的ではないことを願っています。さまざまな状況で助けを求めます;-)