Как разместить несколько файлов с помощью sftp

Вы можете увидеть, что делает df, используяstrace:

$ strace df / |& grep -i ext
statfs("/", {f_type=EXT2_SUPER_MAGIC, f_bsize=4096, f_blocks=4611519, f_bfree=864281, f_bavail=624269, f_files=1179648, f_ffree=620737, f_fsid={126240841, 1491846125}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0

И изman 2 statfs:

The statfs() system call returns information about a mounted
filesystem.  path is the pathname of any file within the mounted
filesystem.  buf is a pointer to a statfs structure defined
approximately as follows:

   struct statfs {
       __fsword_t f_type;    /* Type of filesystem (see below) */
       __fsword_t f_bsize;   /* Optimal transfer block size */
       fsblkcnt_t f_blocks;  /* Total data blocks in filesystem */
       fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
       fsblkcnt_t f_bavail;  /* Free blocks available to
                                unprivileged user */
       fsfilcnt_t f_files;   /* Total file nodes in filesystem */
       fsfilcnt_t f_ffree;   /* Free file nodes in filesystem */
       fsid_t     f_fsid;    /* Filesystem ID */
       __fsword_t f_namelen; /* Maximum length of filenames */
       __fsword_t f_frsize;  /* Fragment size (since Linux 2.6) */
       __fsword_t f_flags;   /* Mount flags of filesystem
                                (since Linux 2.6.36) */
       __fsword_t f_spare[xxx];
                       /* Padding bytes reserved for future use */
   };

Если вам просто нужно свободное пространство точки монтирования, statfsкажется подходящим вариантом. Свободные блоки *размер блока = свободное пространство(-зарезервированное пространство и т. д. ).


Я полагаю, что ext4 должна хранить количество свободных блоков где-то в суперблоке , которое затем используется с размером блока для получения свободного места.

0
31.01.2020, 01:52
2 ответа

Команду cut -d'/' -f2для пропуска строки .в выводе findможно опустить, добавив -type fдля поиска только файлов, а не каталогов.

Команда cut -d'/' -f2не приведет к имени файла, если в подкаталогах есть файлы, также команда для sftpне будет работать в этом случае. Поэтому я предлагаю ограничить глубину для find.

Я предлагаю создать отдельные команды для sftpиз имен файлов, напечатанных find, и передать их в вашу команду sftp.

{ find -maxdepth 1 -type f -mmin -60| cut -d'/' -f2 | sed 's/^/put /' ; echo bye ; } | /usr/local/bin/sshpass -p password sftp -oBatchMode=no adris@XX.XXX.XXX.XX:/folder1

Чтобы увидеть, какие команды созданы для sftp, можно опустить часть | /usr/local/bin/sshpass...

Редактировать

Чтобы зарегистрировать имена файлов, вы можете вставить что-то вроде tee logfileв канал после команды findили cut. Если вы хотите дополнить существующий файл журнала, а не перезаписывать его, используйтеtee -a logfile

Пример:

{ find -maxdepth 1 -type f -mmin -60 | cut -d'/' -f2 | tee logfile | sed 's/^/put /' ; echo bye ; } | /usr/local/bin/sshpass -p password sftp -oBatchMode=no adris@XX.XXX.XXX.XX:/folder1
0
28.04.2021, 23:25

Уверены, что ваша версия sftpподдерживает команду mput? Он не указан ни на одной справочной странице sftp, которую я недавно искал; Я предполагаю, что они могут принять его по соображениям обратной совместимости как «псевдоним» для команды put, которая, в свою очередь, может передавать несколько файлов сама по себе.man sftp:

put [-afPpr] local-path [remote-path]

Upload local-path and store it on the remote machine. If the remote path name is not specified, it is given the same name it has on the local machine. local-path may contain glob(7) characters and may match multiple files.

С двумя параметрами(m)putиспользует второй в качестве имени целевого файла и, таким образом, передает только один файл. Любые другие параметры игнорируются:

sftp> mput file1 file2

Uploading file1 to /user/TMP/file2
file1
100% 48 1.9KB/s 00:00

Возможно, вы захотите использовать sftpпакетный режим для putнескольких не -глобальных файлов.

0
28.04.2021, 23:25

Теги

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