Удивительно, но на самом деле это можно сделать только с помощью rsync (1)
, без доступа оболочки к удаленному серверу.
Предполагая bash (1)
и GNU date (1)
:
#! /usr/bin/env bash
src=rsync://example.com/archives/
dst=/path/to/mirrors
cutoff=$( date -d '7 days ago' +%s )
rsync -na --no-motd --out-format='%M %f' "$src" "$dst" | \
while IFS= read -r line; do
d=${line%% *}
fn=${line#* }
fdate=$( date -d "${d/-/ }" +%s ) || continue
if [ $fdate -ge $cutoff ]; then printf '%s\0' "$fn"; fi
done | \
rsync -a --files-from=- -0 "$src" "$dst"
Псевдонимы всегда можно обойти, заключив в кавычки любую часть имени команды, например, \source
или 'source'
или ''source
или … (если только вы не определили псевдонимы для тех, которые zsh
, но не другие оболочки, позволяет).
Функции можно обойти с помощью префикса command
(например, command source
) в любой оболочке POSIX. В bash или zsh вы можете использовать встроенную
вместо команду
, чтобы принудительно использовать встроенную ( команда
возвращается к поиску PATH
если нет встроенной функции с таким именем, а в zsh (кроме случаев эмуляции других оболочек) команда вообще пропускает встроенные функции). Вы можете отключить функцию, например.
отменить -f источник
.
Если вы переопределили или отключили все встроенные
, команды
и неустановленные
, вам может потребоваться отказаться от идеи восстановления этого экземпляра оболочки в разумное состояние.
Для этого в Bash есть команда builtin
:
builtin: builtin [shell-builtin [arg...]]
Execute shell builtins.
Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.
.
$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello
Однако ничто не мешает вам переопределить builtin
.
Еще один способ обойти псевдонимы (, но не функции ), заключается в заключении в кавычки (части )слова:
$ alias source="echo x"
$ source hello.sh
x hello.sh
$ \source hello.sh
hello