2016-04-03 10 views
0

Я пытаюсь переместить все каталоги менее 1 ГБ. Я пытаюсь использовать эту команду:Переместить каталоги менее 1G

du -h -d 1 -t -1G | xargs -0 mv -it /destination/dir/ 

Но я получаю сообщение об ошибке:

mv: cannot stat [...] File name too long 

Помощь больш была бы оценена :)

+0

попробуйте добавить '-L 1' в xargs:' du -h -d 1 -t -1G | xargs -0 -L 1 mv -it/destination/dir/' – saeedgnu

+0

Спасибо :) Я пробовал с' -L 1', но генерирует следующее сообщение об ошибке: 'mv: can not stat 'du -h -d 1 -t - 1G \ n ': Нет такого файла или каталога 'Я также пробовал с' -n1', но также дал мне сообщение об ошибке 'mv: invalid option -' h'' – nimrag

ответ

0

Итак, вот обходной путь, который служит моим потребностям. Может быть, кто-то может расширить его? В любом случае, если вам не нужно беспокоиться о подкаталогах, то работает следующее.

du -Sb -t -1G | cut -f 2- | xargs -d "\n" mv -t /path/to/destination/ 
0

Я не уверен, почему вы используете аргумент -0 для xargs, поскольку это указывает, что имена файлов разделяются нулевыми байтами, а не пробелами. Результат du не будет содержать никаких нулевых байтов, поэтому весь вывод будет рассматриваться как одно имя файла, что приведет к появлению ошибки, которую вы видите.

Во всяком случае, я предложил бы использовать find:

find /path/to/source -type d -size -1024M -exec mv -it /path/to/destination {} + 

Если вы счастливы, что du уже производит вывод, что вы хотите, и хотите использовать его вместо этого, вы можете добавить переключатель -0 так, что использует разделители с нулевым байтом, тогда ваша текущая команда xargs должна работать.

+0

Спасибо :) К сожалению, я полностью не могу получить' Находите, чтобы согнуть мою волю. Если я просто запускаю все до '-exec', чтобы проверить вывод, он, кажется, игнорирует флаг' -type d' и просто выводит каждый файл меньше 1024M. – nimrag

+0

Возможно, вы можете просто добавить переключатель '-0' в' du' (см. Мое обновление). –

+0

Теперь мы очень близко! Единственная проблема заключается в том, что 'du' выводит размеры dir, которые передаются по каналу в' mv', и, очевидно, 'mv' больше не распознает имена dir. – nimrag