Freebsd: резервное копирование дотфайлов с помощью скрипта оболочки

Это должно быть способно надежно затереть флешку, если вы планируете использовать ее повторно: http://linux.die.net/man/1/scrub Если нет, то расплавьте ее...

0
19.12.2018, 19:26
4 ответа

В тесте [недостаточно информации. Вам нужно сравнить $fileсо ссылкой. Ваша текущая конструкция говорит «если не эта строка», но вам нужно сказать «если x не является этой строкой». Я бы использовал регулярное выражение, то есть с [[вместо [. Следовательно,

#!/bin/bash
GLOBIGNORE=.:..
for file in.*; do
     if [[ ! "$file" =~ \.backup$ ]]; then
         cp "$file" "$file.backup"
     fi
done
  • Согласно комментарию Кусалананды, я переместил шебанг в /bin/bash,чтобы конструкция [[работала.
  • Согласно комментарию Гордона Дэвиссона, я добавил GLOBIGNORE, чтобы скрипт не пытался копировать .и..

Еще кое-что:

  • ./в путях не нужно. Вы уже находитесь в этом каталоге!
  • Я не уверен, что это была просто проблема с копированием -и вставкой, но у вас было вместо ".
  • Лично я бы просто скопировал в другой каталог, избегая всех этих проблем и не загрязняя свой домашний каталог. На самом деле, вместо этого я бы просто (инкрементно )сделал резервную копию всего!

Вот чистая /bin/shверсия. Вместо использования башизма [[я использовал случай .

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

Почему бы нам просто не использовать sedдля резервного копирования?

sed -i.bak 's#\n#\n#' <filepattern*>
0
28.01.2020, 02:31

Оператор !просто инвертирует свой операнд, поэтому условие всегда оценивается как false. Существуют операторы проверки файлов, например -f, которые возвращают true, если файл существует.

Однако я не уверен, что вы все делаете правильно, поскольку безопасно не только создание резервной копии, если она не существует, но и не всегда перезапись существующих резервных копий.

Мог бы и так.

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

Если ваше предполагаемое поведение:

  • создать копию существующих точечных файлов
  • но только если их не существует

тогда, возможно, вы могли бы использовать 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 :не переходить в подкаталоги отсюда
  • -введите f :найдите только обычные файлы
  • -регулярное выражение "^. *[^.bak]$" :все имена файлов, начинающиеся с "." но НЕ заканчивающийся на.bak (расширение резервной копии в этом примере)
  • -exec cp -vn :cp стандартная команда копирования, -n не перезаписывать, -v подробный
  • {} {}.bak :расширяется функцией find до текущего найденного имени файла

Возможно, это альтернативный путь. Надеюсь, не слишком загадочно. Найти помогает во многих случаях;-)

0
28.01.2020, 02:31

Теги

Похожие вопросы