Всегда должна быть петля. Возможно, вы имеете в виду, что вам нужен инструмент, который скрывает этот цикл от вас?
Тогда вы могли бы использовать 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' {} +
Я полагаю, что ваш скрипт запускается из /
, а незащищенный cd "$srcdir"
в какой-то момент дает сбой.
Некоторые предложения
printf
и/или set -x
, чтобы узнать, какие значения содержат ваши переменные rsync --dry-run
и других неразрушающих -операций при тестировании cd "$srcdir"
(cd "$srcdir" || continue
, или if cd "$srcdir"; then...
), или [[ -d "$srcdir" ]] || continue
)cd
, используя полные пути вrsync
Хорошо, после пяти комментариев я дошел до того, что должен просто опубликовать ответ:-)
(Предыдущие комментарии удалены)
Мне кажется, что 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
не используется, и я бы не советовал использовать псевдонимы в сценариях оболочки. Вместо этого вы должны использовать функции.