Рассматривали ли вы со стратегической точки зрения, вместо того чтобы перемещать файлы, оставить текущую структуру на месте и создать ссылки для новой структуры, которую вы хотите?
Тактически схема, которая будет выполнять эту работу, выглядит следующим образом:
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
находит все каталоги ровно на два уровня глубже текущего рабочего каталога, который должен быть каталогом, содержащим группы. :таким образом, на два уровня глубже находятся названия альбомов под названиями групп. 1xargs
использует каждый путь, содержащий альбом, и вызывает встроенный сценарий bash. bash -c '...'
принимает путь к альбому в качестве первого аргумента, разбивая этот путь на две части :группу($b
)и альбом($a
). Наконец, сценарий собирает имена в нужный формат и связывает новое имя каталога с исходным каталогом. Обратите внимание, что в этом примере ссылки будут создаваться в том же каталоге, из которого вы начинаете, а также в том же каталоге, где находятся названия групп.
Вы можете -и должны -изменить описанную выше ln
стратегию, чтобы она соответствовала вашим намерениям. mv
с правильными путями, если вы физически хотите изменить порядок, или ln
, если вы хотите создать удобный «представление» на носителе. Важными частями сценария bash являются:
$b
название группы. Всегда цитируйте его:"$b"
. $a
название альбома. Всегда цитируйте его :"$a"
. $1
физический путь к каталогу альбома. Всегда цитируйте его :"$1"
. 1 Я считаю, что m{ax,in}depth
поддерживаются GNU и некоторыми BSD find
, но не POSIX :, и в этом случае полагайтесь на */*
или аналогичную гимнастику оболочки.
См.
-rw-r--r-- 1 root root 7224 Sep 19 2017 apache2.conf
^^
Корень группы имеет права на чтение файла, но не на его запись, поэтому пользователь ascuser
не может редактировать файл.