Freebsd:使用 shell 脚本备份点文件

Freebsd:使用 shell 脚本备份点文件

需要一个简单的 shell 脚本来复制点文件,添加.备份扩展名,即.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 不是这个字符串”。我会使用正则表达式,即 with[[而不是[.因此,

#!/bin/bash
GLOBIGNORE=.:..
for file in .*; do
     if [[ ! "$file" =~ \.backup$ ]]; then
         cp "$file" "$file.backup"
     fi
done
  • 根据 Kusalananda 的评论,我将 shebang 移至/bin/bash,以确保[[构建工作。
  • 根据戈登·戴维森的评论,我添加了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$ 

查找使用的选项:

  • .:使用当前目录作为起点
  • -maxdepth:不要从这里遍历到子目录
  • -type f:仅查找常规文件
  • -regex "^.*[^.bak]$":所有以“.”开头的文件名但不以 .bak 结尾(本例中的备份扩展名)
  • -exec cp -vn:cp标准复制命令,-n不覆盖,-v详细
  • {} {}.bak:通过 find 扩展为当前找到的文件名

也许这是另一种选择。希望不要太神秘。在许多情况下寻找帮助;-)

相关内容