1

Если в текущем рабочем каталоге есть несколько подкаталогов, я бы хотел переместить только рабочие типы файлов или, возможно, все содержимое этих каталогов в рабочий каталог. а потом; «rmdir *» эти пустые каталоги или «rm -r» эти каталоги (если не пустые)

Разве это не нужно делать с помощью утилиты find, тогда pipe | вывод на «мв.» (переместить результаты поиска в рабочий каталог)? Если да, то какие параметры поиска мне нужно передать, например, или Какие команды следует использовать для файлов rm или mv в подкаталогах, а затем, возможно, удалить каталоги?

Безопасен ли этот метод для перемещения повторяющихся имен файлов в одном каталоге? или файлы будут перезаписаны, если, например, существует много index.htmls

Это должно быть основной задачей в указанных типах файлов Unix, mv или rm из нескольких подкаталогов

2 ответа2

3

Следующее перемещает все 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 .

0

Вы можете сделать это за один раз с помощью команды вроде:\

find . -name '*.goaway' -exec mv '{}' destination \;

но более безопасный способ - начать, просто посмотрев, что выискивает для вас команда find, возможно, отправив ее в файл, который вы можете использовать для выполнения срочных операций.

И да, если вы переместите все ваши index.html в одну и ту же директорию, они будут забивать друг друга, а после вас будет перемещен только последний.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .