Как я могу переместить каталог (и все вложенные файлы / каталоги), но переместить элементы в алфавитном порядке?

Когда я запускаю следующее:

mv -v foo /mnt/bar 

Каталог foo и все его подкаталоги перемещаются в каталог /mnt/bar . Порядок перемещения файлов выглядит как порядок каталогов ( ls -U ).

Есть ли хороший способ выполнить эту же операцию, но убедиться, что вложенные файлы / каталоги foo перемещены в алфавитном порядке?

Я понимаю, что могу использовать find -exec mv для перебора содержимого в алфавитном порядке, но это требует некоторой раздражающей гимнастики для поддержания той же структуры подкаталогов в цели. Я надеялся на флаг на GNU mv но страница руководства не показывает ничего полезного.

 $ \ls foo | xargs -I% mv -v foo/% bar 'foo/one' -> 'bar/one' 'foo/sie' -> 'bar/sie' 'foo/two' -> 'bar/two' 'foo/uve' -> 'bar/uve' 'foo/wox' -> 'bar/wox' 'foo/zanzibar' -> 'bar/zanzibar' 
  1. Используйте ls для enums элементов в алфавитном порядке. Чтобы убедиться, что вы используете чистый ls (без дополнительных символов, добавленных псевдонимом, скрытым в вашем .bashrc или .bash_aliases), введите команду \ls
  2. Отправить вывод ls в xargs
  3. Присвойте каждому элементу имя переменной с переменной -I (это просто даст вам что-то «увидеть» в вашей команде mv )
  4. Переместите ваш элемент (называемый % ) из его местоположения в foo в новое место назначения.

С zsh и реализацией pax поддерживающей -0 :

 printf '%s\0' foo foo/**/*(D) | pax -0rwdv /mnt/bar/ && rm -rf foo 

Эти рекурсивные глобусы сортируются лексически (с использованием порядка сопоставления локали) на каждом уровне. a до a/a до a/b до b

Обратите внимание, что это не то же самое, что find foo -print0 | sort -z find foo -print0 | sort -z который сортирует пути в целом и, например, сортирует:

 a a/b a/bc a/b/c 

В этом порядке в языке C вместо:

 a a/b a/b/c a/bc 

в зш шаров.