Выделенное дисковое пространство является пределом на дисковое пространство, которое может занять пользователь. Это не имеет никакого отношения к свободному пространству на диске. Посмотрите на страницу руководства для квоты (1). Таким образом, при попытке синхронизировать (выписывают данные, сохраненные в памяти, предназначенной в файлы на диске) это находит, что Нельзя записать так много данных.
И BTW, нет никакого "пространства в папках" в Unix/Linux. Каталог является просто ассоциацией между именами и inodes, и inode представляет файл/каталог (с его владельцем/группой, полномочиями и содержавшими данными). inode может очень хорошо быть перечислен больше чем в одном каталоге, или даже несколько раз под различными именами в том же каталоге.
Используйте tr
команда
echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| tr " " "\n"
Найденный на http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
В этом случае я использовал бы printf:
printf '%s\n' /path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
Если существуют пробелы в том из путей, можно заключить этому в кавычки filepath, чтобы препятствовать тому, чтобы он был разделен на пробелах:
printf '%s\n' /path/to/file '/path/to/file with spaces' /path/to/another/file
Преобразовать текст в целом, tr
Ваш лучший выбор, как покрыто в существующий ответ.
Принятие Вас имеет строку с пробелами как разделители:
newline_separated=${space_separated// /$'\n'}
Однако Вы, вероятно, задаете неправильный вопрос. (Не обязательно, например, это могло бы подойти в make-файле.) Разделенный пробелом список имен файлов действительно не работает: что, если одни из имен файлов содержали пробелы?
Если программа получает имена файлов как аргументы, не присоединяйтесь к ним с пробелами. Использовать "$@"
получить доступ к ним один за другим. Хотя echo "$@"
печатает споры с промежуточными пробелами, это происходит из-за echo
: это печатает свои споры с пробелами как разделители. somecommand "$@"
передает имена файлов как отдельные аргументы команде. Если Вы хотите распечатать аргументы на отдельных строках, можно использовать
printf '%s\n' "$@"
Если у Вас действительно есть разделенные пробелом имена файлов, и Вы хотите поместить их в массив для работы над ними, можно использовать неупомянутое переменное расширение для разделения значения в символах на IFS
(необходимо будет отключить подстановочное расширение с set -f
, иначе шаблоны шарика будут расширены в значении):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
Можно инкапсулировать это в функции, которая восстанавливает -f
установка и значение IFS
когда это сделано:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …
set -f
и IFS
в руководстве удара, если Вы хотите все подробности. См. также unix.stackexchange.com/questions/16192 / …
– Gilles 'SO- stop being evil'
12.12.2014, 00:26
Будьте прагматически настроены, используйте sed!!
sed 's/\s\+/\n/g' file
Вышеупомянутое говорит для замены одним или несколькими пробельными символами (\s +) с новой строкой (\n)
Это более или менее:
'substitute /one space or more/ for /newline/ globally'
Вот то, как я сделал это:
echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g
Заметьте использование клавиши Enter после обратной косой черты в sed
команда.
sed
поскольку это - редактор, а не просто переведите символы.
– unxnut
17.12.2013, 17:38
sed
может сделать настолько больше, но полностью излишество для этого. tr
правильный инструмент для ЭТОГО задания, но знание sed
и regexes, конечно, пригодится позже!
– Rob
17.12.2013, 17:44
Другой подход, принимая строку находится в названной переменной line
:
for path in $line;do echo $path;done
Это использует то, что Bash разделяет свои аргументы на пробеле по умолчанию и что echo
добавляет новую строку к ее входу по умолчанию.
Следующий скрипт прост в понимании и использовании.
cat filename | tr ' ' '\n' | tee filename
В качестве альтернативы tr
от @laconbass вы также можете использовать xargs
в этом случае:
echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| xargs -n1
Преимущество в том, что он работает даже с несколькими пробелами, что tr
нет.
echo word1 word2 ... | sed -e 'y/ /\n/;P;D'
— это еще один способ превратить слова, разделенные одинарным пробелом, в слова, разделенные новой строкой.
tr
для, хотя! – Rob 17.12.2013, 17:43