Проблема - то, что Вы, вероятно, работаете ssh-agent
в Вашей интерактивной среде, но не делают в кроне и что Ваше ssh ключевое имя файла отличается от имен файлов по умолчанию.
Для решения этого, можно или явно указать, что ssh вводят scp командную строку, т.е. scp -i $SSH_KEY_FILENAME
или укажите соответствующее ~/.ssh/config
запись для Вашего хоста, т.е.:
Host backuphost
IdentityFile SSH_KEY_FILENAME
Для тестирования сценария, можно попытаться выполнить его через env -i /path/to/your/script
который должен сбросить Вашу среду и подражать среде крона.
Это может быть сделано в очень простом сценарии оболочки:
for file in *; do echo -n "$file" | wc -m; done
Просто цикл через каждый файл, повторяющий имя к wc
. -n
на echo
то, так, чтобы это не добавляло новую строку, которая ошибочно увеличила бы количество на 1.
В то время как ответ @Patrick прекрасно подходит, если необходимо сделать подобную задачу по ценности дерева каталогов файлов, необходимо будет изменить тактику немного. Один метод для обработки этого должен использовать find
& while
.
$ depth=2
$ find . -maxdepth $depth -type f -print0 | sed 's|\./||g' | \
while IFS= read -r -d '' file; do \
f=$(basename "$file"); printf "%s: %s\n" "$file" "${#f}"; \
done | column -s : -t
dir2/more files3.txt 15
some long spacey file.txt 25
dir1/more files1.txt 15
dir1/more files2.txt 15
file 1.txt 10
file 2.txt 10
Вышеупомянутое генерирует список файлов, разделенных \0
(т.е. Аннулирует). Можно использовать переменную $depth
управлять как глубоко find
посмотрит. Этот список затем вычищается так, чтобы любой .\
символы удалены через sed
.
Наконец мы циклично выполняемся через этот список и используем a printf
распечатать имя каждого файла наряду с его длиной, с помощью встроенного средства Bash для подсчета длины строки, ${#var}
. printf
распечатает файл + его путь, но только размер файла.
column -s : -t
только к структурной распечатке программы это. Это делает так путем разделения вывода на двоеточии, :
, и затем разделяя вывод на равноотстоящие столбцы.
var=$'hello\nworld';echo -n "$var" | wc -m
=> 11
– glenn jackman
14.01.2014, 04:09
for f in *
- использование подстановочного знака избегает разделения слова. Оболочка знает, что Вы выполняете итерации по именам файлов. Когда Вы делаете for f in $(...)
Вы выполняете итерации по словам в текстовом выводе некоторой программы.
– glenn jackman
14.01.2014, 13:28
echo -n
подсказка. Я заметилwc
считал один дополнительный символ, но еще не начал останавливаться на том. – Fabricio 14.01.2014, 03:00