Уплотнение каталога иерархии Сохранение имен каталогов в новом имени каталога

Вы можете использовать утилиту printf для вставки, например,

$(ls|grep "A-B-$(printf '%06d' $sequencenumber)-.*"|wc -l)

Два момента:

  • хотя и `foo`, и $(foo) являются стандартными, вложенные бэкграунды не так переносимы
  • утилита printf полезна не только для вставки.

8
03.01.2019, 18:16
3 ответа

Зш

Не проверено:

zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)

Вторая строка удаляет все пустые каталоги, даже те, в которых раньше не было файла. Это можно обойти с помощью пользовательской оболочки mv, которая записывает, из каких каталогов перемещаются объекты.

Обратите внимание, что при этом передаются символические ссылки на каталоги в текущем каталоге.

Утилита переименования Linux

Не проверено.

rename / ' - ' */*/
rmdir -- */ 2>/dev/null

Обратите внимание, что при этом проходятся символические ссылки на каталоги в текущем каталоге и в его подкаталогах. Вторая строка удаляет все пустые каталоги, даже те, в которых раньше не было файла.

Perl-скрипт переименования

Не проверено.

prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null

Обратите внимание, что при этом проходятся символические ссылки на каталоги в текущем каталоге и в его подкаталогах. Вторая строка удаляет все пустые каталоги, даже те, в которых раньше не было файла.

Вот более сложный подход, который удаляет только те каталоги, из которых он что-то переименовал. Опять же, не проверено.

prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/
9
27.01.2020, 20:08

Что-то вроде этого?

#!/bin/sh

for topdir in */; do
    topdir_name=$( basename "$topdir" )

    for subdir in "$topdir"/*/; do
        subdir_name=$( basename "$subdir" )

        newdir="$topdir_name - $subdir_name"
        if mkdir "$newdir"; then
            mv "$subdir"/* "$newdir"
            rmdir "$subdir"
        fi
    done

    rmdir "$topdir"
done

Это проходит через все каталоги верхнего -уровня в текущем каталоге (названия групп ). Для каждого такого каталога он проходит через его подкаталоги (по названиям альбомов ). Для каждой пары названия группы и названия альбома создается новый каталог, в который перемещаются файлы из подкаталога. Подкаталоги альбомов удаляются после обработки, как и исходные каталоги верхнего уровня группы -.

Вызовы rmdirзавершатся ошибкой, если какой-либо каталог содержит скрытые имена файлов или если не удалось создать какой-либо из новых каталогов.

Это полностью непроверенный код. Запустите его на резервной копии -ваших файлов.

12
27.01.2020, 20:08

Рассматривали ли вы со стратегической точки зрения, вместо того чтобы перемещать файлы, оставить текущую структуру на месте и создать ссылки для новой структуры, которую вы хотите?

Тактически схема, которая будет выполнять эту работу, выглядит следующим образом:

find. -mindepth 2 -maxdepth 2 -type d -print0 | xargs -0n1 bash -c \
  'b=$(basename "$(dirname "$1")"); a=$(basename "$1"); echo ln -s "$1" "$b-$a"' {}
  • findнаходит все каталоги ровно на два уровня глубже текущего рабочего каталога, который должен быть каталогом, содержащим группы. :таким образом, на два уровня глубже находятся названия альбомов под названиями групп. 1
  • xargsиспользует каждый путь, содержащий альбом, и вызывает встроенный сценарий bash.
  • bash -c '...'принимает путь к альбому в качестве первого аргумента, разбивая этот путь на две части :группу($b)и альбом($a). Наконец, сценарий собирает имена в нужный формат и связывает новое имя каталога с исходным каталогом.

Обратите внимание, что в этом примере ссылки будут создаваться в том же каталоге, из которого вы начинаете, а также в том же каталоге, где находятся названия групп.

Вы можете -и должны -изменить описанную выше lnстратегию, чтобы она соответствовала вашим намерениям. mvс правильными путями, если вы физически хотите изменить порядок, или ln, если вы хотите создать удобный «представление» на носителе. Важными частями сценария bash являются:

  • $bназвание группы. Всегда цитируйте его:"$b".
  • $aназвание альбома. Всегда цитируйте его :"$a".
  • $1физический путь к каталогу альбома. Всегда цитируйте его :"$1".

1 Я считаю, что m{ax,in}depthподдерживаются GNU и некоторыми BSD find, но не POSIX :, и в этом случае полагайтесь на */*или аналогичную гимнастику оболочки.

4
27.01.2020, 20:08

Теги

Похожие вопросы