Следующее перемещает все HTML-файлы из foo
и удаляет пустые каталоги:
$ find foo -name '*.html' -type f -exec mv -nv "{}" '.' \;
foo/bar/1.html -> ./1.html
./1.html not overwritten
foo/baz/qux/3.html -> ./3.html
foo/baz/qux/5.html -> ./5.html
$ find foo -depth -type d -delete
Осталось HTML-файлы с конфликтующими именами, файлы, которые не являются HTML-файлами, и непустые папки.
Чтобы автоматически переименовывать файлы для предотвращения дублирования имен файлов, вы можете использовать mktemp
. Синтаксис различен для разных операционных систем, и приведенный ниже работает на OS X и предположительно на BSD:
find foo -name '*.html' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
foo/bar/1.html -> ./1.html.yNr
foo/baz/1.html -> ./1.html.RUu
foo/baz/qux/3.html -> ./3.html.rzu
foo/baz/qux/5.html -> ./5.html.JyW
Для каждого найденного HTML-файла он запускает bash и выполняет команду после -c
, которая на самом деле представляет собой просто mv
с динамически созданным (используя mktemp
) именем файла назначения в текущем каталоге.
Для того, чтобы убедиться , что он будет работать , как задумано, вы можете echo
mv
команды сначала в качестве предварительного просмотра:
find foo -name '*.html' -type f -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
mv -v foo/bar/1.html ./1.html.VNf
mv -v foo/baz/1.html ./1.html.pCW
mv -v foo/baz/qux/3.html ./3.html.ADN
mv -v foo/baz/qux/5.html ./5.html.K3w
Как вы можете видеть, каждый вызов приводит к различному суффиксу благодаря mktemp
в скрипте bash
(вы не можете просто включить эту часть в обычный -exec mv
поскольку он будет оценен один раз для вызова find
, а затем использовать тот же суффикс за все переехал).
В зависимости от количества задействованных файлов вам может потребоваться больший случайный суффикс, чем просто .XXX
.