需要一个简单的 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 扩展为当前找到的文件名
也许这是另一种选择。希望不要太神秘。在许多情况下寻找帮助;-)