Количество количества символов на перечисленное имя файла

Проблема - то, что Вы, вероятно, работаете ssh-agent в Вашей интерактивной среде, но не делают в кроне и что Ваше ssh ключевое имя файла отличается от имен файлов по умолчанию.

Для решения этого, можно или явно указать, что ssh вводят scp командную строку, т.е. scp -i $SSH_KEY_FILENAME или укажите соответствующее ~/.ssh/config запись для Вашего хоста, т.е.:

Host backuphost
    IdentityFile SSH_KEY_FILENAME

Для тестирования сценария, можно попытаться выполнить его через env -i /path/to/your/script который должен сбросить Вашу среду и подражать среде крона.

4
14.01.2014, 04:50
3 ответа

Это может быть сделано в очень простом сценарии оболочки:

for file in *; do echo -n "$file" | wc -m; done

Просто цикл через каждый файл, повторяющий имя к wc. -n на echo то, так, чтобы это не добавляло новую строку, которая ошибочно увеличила бы количество на 1.

4
27.01.2020, 20:48
  • 1
    Прекрасный.Спасибо. Также спасибо за echo -n подсказка. Я заметил wc считал один дополнительный символ, но еще не начал останавливаться на том. –  Fabricio 14.01.2014, 03:00

Вы не должны обращаться wc, удар совершенно способен: ${#var} длина значения $var.

for f in *; do echo ${#f}; done

ссылка

5
27.01.2020, 20:48

В то время как ответ @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 только к структурной распечатке программы это. Это делает так путем разделения вывода на двоеточии, :, и затем разделяя вывод на равноотстоящие столбцы.

1
27.01.2020, 20:48
  • 1
    Нет никакой пробельной проблемы в ответе Patrick, даже новые строки. Так как переменная заключается в кавычки, нет никакой проблемы с горизонтальным пробелом: var=$'hello\nworld';echo -n "$var" | wc -m => 11 –  glenn jackman 14.01.2014, 04:09
  • 2
    @glennjackman - что я пропускаю затем? unix.stackexchange.com/questions/9496 / …. Я знаю, что переключился назад и вперед по этой самой раздражающей теме. Я попробовал его код, и Вы - корректный BTW. –  slm♦ 14.01.2014, 04:22
  • 3
    Различие for f in * - использование подстановочного знака избегает разделения слова. Оболочка знает, что Вы выполняете итерации по именам файлов. Когда Вы делаете for f in $(...) Вы выполняете итерации по словам в текстовом выводе некоторой программы. –  glenn jackman 14.01.2014, 13:28
  • 4
    @glennjackman - спасибо, это - то, что я отчасти изобразил, но немного больше исследования и перепереизучения его я теперь вижу различное –  slm♦ 14.01.2014, 15:08
  • 5
    Более подробно я предполагаю, что подстановочный знак расширен в имена файлов, и те имена файлов не подвергаются 2-му раунду разделяющего слово расширения. –  glenn jackman 14.01.2014, 16:27

Теги

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