Скопируйте все файлы из подкаталогов и подподкаталогов в основной каталог с изменением имен файлов, добавив префикс всех родительских каталогов

CentOS включает SELinux по умолчанию, что накладывает дополнительные ограничения безопасности на систему. Политика по умолчанию в основном охватывает стандартные конфигурации/конфигурации по умолчанию для ограниченного программного обеспечения. Когда доступ запрещен, обычно в журналах аудита создается запись в /var/log/audit/audit.log.

При использовании съемного носителя следует рассмотреть возможность подключения устройства с опцией контекста SELinux. Таким образом, вы избежите изменения политики SELinux вашей системы и необходимости перемаркировки файловой системы на съемном устройстве. Вы можете использовать samba_share_t, если вы собираетесь использовать только точку монтирования с samba. Если вы используете/маркируете тип user_home_t,файлы будут обрабатываться так, как если бы они находились в домашнем каталоге пользователя.

mount -t ext4 /dev/sdb /mnt/ELEMENTERY-1TB \
      -o context="system_u:object_r:samba_share_t:s0"

Или в/etc/fstab

UUID=<...> /mnt/ELEMENTERY-1TB/ ext4 defaults,errors=remount-ro,context="system_u:object_r:samba_share_t:s0" 0 1

Если у вас по-прежнему возникают проблемы с SELinux, вы можете использовать audit2why, чтобы узнать, почему доступ был запрещен, и, возможно, существует ли логическое значение SELinux , разрешающее доступ. Если вам нужно изменить политику SELinux, вы можете использоватьaudit2allowдля создания модуля политики, чтобы разрешить доступ.

Есть также два логических значения samba_export_all_roи samba_export_all_rw, если они включены, разрешают Samba доступ к (и совместное использование )любых файлов. В этом случае это дает samba значительно больший доступ, чем требуется, и поэтому не следует использовать в этой ситуации , так как параметры монтирования можно легко настроить.

0
28.11.2019, 14:02
2 ответа

Попробуйте:

find  -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;

(удалить "эхо", если команды выглядят хорошо)

.
└── 1
    └── 2
        ├── 3
        │   └── 4
        │       └── foo.dat
        └── foo.dat

Урожайность:

cp./1/2/3/4/foo.dat./1-2-3-4-foo.dat
cp./1/2/foo.dat./1-2-foo.dat

По сути, вы запускаете специальный -небольшой скрипт(cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"для каждого файла, который соответствует и этот сценарий генерирует целевое имя, заменяя все /в исходном пути на -. Строка tinyscriptможет быть любой, это просто имя, которое используется как имя скрипта в случае ошибок.

0
28.01.2020, 03:05

Предпочитая простоту производительности, это не особенно эффективно (из-за запуска процесса bash для каждого файла ). Если у вас много файлов и/или время является фактором, может потребоваться более сложное решение.

find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'
0
28.01.2020, 03:05

Теги

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