Сценарий внезапно запускается, перемещает системные файлы вместо другого каталога

Всегда должна быть петля. Возможно, вы имеете в виду, что вам нужен инструмент, который скрывает этот цикл от вас?

Тогда вы могли бы использовать perl's rename(, иногда называемый prenameилиperl-rename):

rename 's/\.[^.]+\.*\z//s'./*.*

или zshсzmv:

autoload zmv
zmv '(*).[^.]##.#' '$1'

Они по умолчанию не переименовывают скрытые файлы (тех, имя которых начинается с.). Если бы вы хотели обработать и их, вы бы сделали:

zmv '(?*).[^.]##.#(#qD)' '$1'

Те считают, что в .foo.bar.расширение.bar.(и не считают foo...расширением ). Вы можете адаптироваться, если хотите считать, что это .вместо(zmv '(?*).*(#qD)' '$1'). Я не ожидаю, что вы захотите рассматривать это как .foo.bar.(, который zmv '*(#qD)' '${f%%.*}'лишит (, но потерпит неудачу, поскольку файл не может иметь пустое имя )).

Также обратите внимание, что в file.tar.gzрасширение считается .gz, а не .tar.gz.

Сделать это рекурсивно:

zmv '(**/)(?*).[^.]##.#(#qD)' '$1$2'

Или сrename:

find. -depth -name '?*.*' -exec rename 's/\.[^./]+\.*\z//s' {} +
1
23.10.2019, 13:08
2 ответа

Я полагаю, что ваш скрипт запускается из /, а незащищенный cd "$srcdir"в какой-то момент дает сбой.

Некоторые предложения

  • Используйте операторы printfи/или set -x, чтобы узнать, какие значения содержат ваши переменные
  • Использование rsync --dry-runи других неразрушающих -операций при тестировании
  • Защитите cd "$srcdir"(cd "$srcdir" || continue, или if cd "$srcdir"; then...), или [[ -d "$srcdir" ]] || continue)
  • .
  • Еще лучше, нигде не меняйте каталог и избегайте cd, используя полные пути вrsync
1
27.01.2020, 23:40

Хорошо, после пяти комментариев я дошел до того, что должен просто опубликовать ответ:-)

(Предыдущие комментарии удалены)

Мне кажется, что dstdir1и dstdir2могут быть пустыми, так что ваша командаrsync-синхронизируется с /.

Чтобы предотвратить такие ошибки, измените заголовок вашего файла (завершающий пробел, необходимый после-):

#!/bin/bash - 
set -o nounset   # exit on unset variables.
set -o errexit   # exit on any error.

Может оказаться полезным установить shellcheckна вашу коробку.

Я проверил его на вашем скрипте, и он жалуется на некавычки vars в строках 7, 10, 11, 13, 41 и 49. onlyonce=0кажется неиспользуемым.

Псевдоним brcне используется, и я бы не советовал использовать псевдонимы в сценариях оболочки. Вместо этого вы должны использовать функции.

0
27.01.2020, 23:40

Теги

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