LINUX.ORG.RU

bash скрипт и пробелы в имени файла

 


0

2

Была такая тема: bash скрипт и размер файлов

Там уже разобрался.

#!/bin/bash
byte=0
for file in "$@"; do let byte+=`du -b $file | awk '{print $1}'`; done
echo "Суммарный размер файлов = ${byte} байт."
exit 0

Но как заставить скрипт работать с именами, имеющими пробел? Конструкция

for file in "$@"; do let byte+=`du -b $file | awk '{print $1}'[-f "newfile"]`; done
Не срабатывают. Что не так?


-for file in "$@"; do let byte+=`du -b $file | awk '{print $1}'`; done
+for file in "$@"; do let byte+=`du -b "$file" | awk '{print $1}'`; done
Burunduk
()

Попробуйте

#!/bin/bash
byte=0
while [ $# -ge 1 ]
do 
   let byte+=`du -b "$1" | awk '{print $1}'`
   shift
done
echo "Суммарный размер файлов = ${byte} байт."

Micky53
()

А man du не смотрели?:)

du -scb $@ | tail -1 | cut -f1

Не проверял, но надеюсь что не напутал.

Обычно все задачки по bash - скрипты-однострочники.

RPG
()
Последнее исправление: RPG (всего исправлений: 2)
Ответ на: комментарий от RPG

Шел двадцать первый век, а линуксоиды всё ещё имели проблемы с пробелами в именах файлов.

Правильно так:

du -scb "$@" | tail -1 | cut -f1

Тут ещё не учитываются файлы, имена которых начинаются с минуса. Фикс:

du -scb -- "$@" | tail -1 | cut -f1

NeXTSTEP ★★
()

Шел двадцать первый век, а юзер NeXTSTEP всё ещё не понимает, что проблема не в пробелах в именах файлов, а в шеле, который их интерпретирует как разделитель.

sdio ★★★★★
()
Ответ на: комментарий от sdio

Вообще-то в шелле можно изменить поведение интерпретатора, убрав из списка разделителей пробел, и дело в шляпе.

RPG
()
Ответ на: комментарий от sdio

Шел двадцать первый век

А шеллы до сих пор все сводят к строковому типу.

TGZ ★★★★
()

при использовании while с read проблем с пробелами не возникает.

ls | while read name ; do echo $name ; done

в случае с for, можно привлеч sed.

ls | for name in `ls | sed 's/ /[[:space:]]/g'` ; do echo $name ; done

и так далее, фантазируй )

eiler13
()
Ответ на: комментарий от eiler13

Возникает, если в пробел находится в начале или конце имени. Фикс:

ls | while IFS= read name ; do echo "$name" ; done

Зато начинаются проблемы если в имени файла есть символ перевода строки. В таких случаях надо использовать такую конструкцию:

find -maxdepth 1 -mindepth 1 -print0 | xargs -0 # ...

Хвала Аллаху, что символ с кодом 0 нельзя использовать в имени файла.

NeXTSTEP ★★
()
Ответ на: комментарий от Micky53

Нет такого файла или каталога.

Вообще странно- ни один вариант не пашет

triest
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.