То, о чем вы просите, не сработает.
Перемещение файлов по символической ссылке в /var
, указывающей на /tmp
, по-прежнему будет занимать место в root
, поскольку индексный дескриптор по-прежнему будет указывать на каталог /tmp
, расположенный в root
. Вы можете убедиться в этом сами.
Единственный вариант — либо переместить данные из /tmp
в другое место, либо добавить место в ваш root
LVM, так как именно там находится ваш каталог /tmp
.
Для GNU xargs
параметр -i
является (устаревшим и )совпадает с -I {}
. Это означает «заменить вхождение строки {}
в утилите одним элементом из стандартного ввода, затем запустить утилиту и повторить со следующим элементом из стандартного ввода».
Ваш вызов утилиты — echo {}
, и вы передаете две вещи в xargs
. Это означает вызов echo
дважды, каждый раз с одним из элементов, считываемым со стандартного ввода. Каждый вызов echo
выводит завершающую новую строку (, это особенность echo
).
Без echo {}
и -i
xargs
соберет как можно больше элементов из стандартного ввода и выведет их, как если бы он вызвал echo
со всеми ими одновременно.
Короче говоря, xargs
не добавляет новую строку, echo
добавляет. Он делает это, потому что вы вызываете его несколько раз.
Пример (с добавлением -t
, чтобы xargs
показывал, что он делает):
$ printf 'file1\nfile2\n' | xargs -t -I {} echo {}
echo file1
file1
echo file2
file2
$ printf 'file1\nfile2\n' | xargs -t echo
echo file1 file2
file1 file2
Символы новой строки добавляются с помощью echo
, , а не с помощью xargs
.
Разница при использовании -i
заключается в том, что эта опция задает-L 1
(одну строку или одно поле, разделенное нулевым значением, на команду ). Таким образом, echo
запускается один раз для каждого поля ввода, и, таким образом, символ новой строки между полями(echo
обычно добавляет символ новой строки после завершения ).
Без -i
и, следовательно, без -L 1
каждое эхо получает больше поля, поэтому большинство полей разделяются пробелом (эхо конкатенация его аргументов, разделенных пробелом ).