В именах файлов можно использовать любые символы, кроме нулевого символа(\0
)и косой черты, которая является разделителем пути. Переменные могут содержать любые данные (, за исключением нулевых символов в большинстве оболочек ). При правильном заключении в кавычки имена файлов можно безопасно хранить в переменных и использовать с утилитами.
О ваших баллах:
Для перебора набора файлов (обычных файлов или каталогов )вы можете использовать простой цикл оболочки, например
for name in./*; do
# some code that uses "$name"
done
Для перебора файлов при выборе определенных файлов с использованием определенных критериев find
является лучшим выбором. например, чтобы выбрать все обычные файлы в текущем каталоге (или ниже ), которые старше N
дней, (имеют дату изменения не менее N
дней назад):
find. -type f -mtime +N
Точно так же -size
используется для выбора файлов по размеру и -name
для сопоставления имени файла с шаблоном подстановки.
Например, чтобы выбрать обычные файлы, имена которых соответствуют *.mov
и которые были изменены за последнюю неделю:
find. -type f -name '*.mov' -mtime -7
Затем, чтобы на самом деле сделать что-то с этими файлами, например переместить их в каталог $HOME/Movies
:
find. -type f -name '*.mov' -mtime -7 -exec mv {} "$HOME/Movies" ';'
{}
будет заменено путем к файлу при вызове mv
. Вам не нужно заключать{}
(в кавычки, это ничего не изменит, если вы сделаете ), так как find
не будет вызывать разбиение слов оболочки или расширение имени файла в имени пути.
Дальнейшим улучшением этого будет обнаружение конфликтов имен файлов в целевом каталоге. Для этого мы используем короткий вспомогательный скрипт, который будет принимать несколько имен файлов в своей командной строке:
destdir="$HOME/Movies"
for name do
if [ -f "$destdir/${name##*/}" ]; then
printf "%s already exists in %s, not overwriting it!\n" "${name##*/}" "$destdir" >&2
else
mv "$name" "$destdir"
fi
done
или сокращенно:
destdir="$HOME/Movies"
for name do
[ -f "$destdir/${name##*/}" ] && printf "skipping %s\n" "$name" >&2 && continue
mv "$name" "$destdir"
done
Подключаем это к нашей команде find
:
find. -type f -name '*.mov' -mtime -7 -exec sh -c '
destdir="$HOME/Movies"
for name do
[ -f "$destdir/${name##*/}" ] && printf "skipping %s\n" "$name" >&2 && continue
mv "$name" "$destdir"
done' sh {} +
Нигде на этом пути мы не позволяем оболочке выполнять разбиение на слова или подстановку имени файла для пути или имени файла, которые мы в данный момент обрабатываем.
Для получения дополнительной информации:
Используйте ProxyJump
, это то же самое, что и ssh -J
, т.е. подключение через узлы перехода.
scp -oProxyJump=userB@B,userC@C file userD@D:/path/to/target
Пропустить определение пользователей, если в этом нет необходимости:
scp -oProxyJump=B,C file D:/path/to/target
man 5 ssh_config
ProxyJump
Specifies one or more jump proxies as either [user@]host[:port] or an ssh URI. Multiple proxies may be separated by comma characters and will be visited sequentially. Setting this option will cause ssh(1) to connect to the target host by first making a ssh(1) connection to the specified ProxyJump host and then establishing a TCP forwarding to the ultimate target from there.
Учитывая размер ваших файлов, вас может заинтересовать отказоустойчивость на случай прерывания соединения. rsync
может возобновить прерванную передачу и использовать опцию узла перехода ssh
:
rsync -P -e"ssh -oProxyJump=userB@B,userC@C" file userD@D:/path/to/target/