Почитал. "du - Подчсчитывает использование диска каждым файлом......"
Т.о. в моём случае du возвращает значение кратное 4096 байт. И с ftp всё равно не читает.
Вообще то я не точно задал вопрос. Мне не нужно знать размер файла. Мне требуется сравнить размер файла, лежащего на ftp с локальным файлом. Т.е. узнать, одного ли они размера.
Синхронизацию хотим сделать? С ftp это будет весьма муторно и неэкономно по трафику (если изменился 1 байт в начале файла или поменялся размер, надо перекачивать весь файл).
Если есть шелл (или тамошний админ согласен поставить указанный ниже софт сам) на удаленной машине, смотрите в сторону rsync. Специально предназначенная вещь для синхронизации пары хранилищ. Как еще один бонус получите перекачку не файлов целиком, а только различающихся фрагментов.
Не синхронизацию. Просто после закачки файла требуется проверить, успешно ли он закачан, т.к. канал не ахти какой и частенько пропадает. Проверяю, сравнивая размеры на ftp и оригинала. Если отличаются,повторяю заканчку и так до победного конца. Наверняка есть более правильное решение (типа закачка с докачкой), но честно говоря мне некогда разбираться, я не админ.
Но раз я начинал вопрос о bash, ответьте пож. на пару вопросов. if [-e my_file] #истина, если файл существует но никак не получается определить, что его нет, без использования else. if [! -e my_file] #это не проходит!
И ещё. Почему в одном случае можно занести в переменную результат программы, например: MYVAR=`ls -l` а в другом случае нет: MYVAR=`wget ftp://MY_SERVER/incoming/my_file -nv` Приходится использовать промежуточный файл
> Наверняка есть более правильное решение (типа закачка с докачкой)
rsync, будет качать, пока не приемник не станет идентичным источнику.
Еще посмотрите http://itooktheredpill.dyndns.org/wput/ -- "wget наоборот". Если удаленный сервер не поддерживает докачку "в себя",
это все бесполезно.
> if [! -e my_file] #это не проходит!
Странно.
tony:~/build/1$ bash --version
GNU bash, version 2.05a.0(1)-release (i386-slackware-linux-gnu)
Copyright 2001 Free Software Foundation, Inc.
tony:~/build/1$ cat test.sh
#!/bin/bash
if [ ! -e $1 ]; then
echo "No such file:" $1
fi
tony:~/build/1$ ls -l
-rw-r--r-- 1 tony users 0 Jan 27 08:49 a
-rwxr--r-- 1 tony users 64 Jan 27 11:13 test.sh*
tony:~/build/1$ ./test.sh a
tony:~/build/1$ ./test.sh b
No such file: b
> Почему в одном случае можно занести в переменную
результат программы, например: MYVAR=`ls -l`
а в другом случае нет: MYVAR=`wget ftp://MY_SERVER/incoming/my_file -nv`
Возможно, дело в том, что wget выводит не в stdout, а в stderr.
Обычно оба эти потока направлены на консоль. Попробуйте так:
MYVAR=`wget ftp://MY_SERVER/incoming/my_file -nv 2>&1`