Изменить разрешение папки на основе list.txt

У меня есть 3 массивные папки, содержащие множество других папок, которые мне нужно предоставить третьим лицам для скачивания через SFTP.

На данный момент каждая папка в основном каталоге установлена ​​для прав загрузки для SFTP, поэтому моя идея состоит в том, чтобы создать файл list.txt, содержащий файлы, которые пользователь не может получить, и установить права на что-то? Или переместите эти файлы в другую папку?

В указанной папке будет более 2000 папок, содержащих миллион файлов более 500 ГБ, и мне нужно удалить доступ к половине из них

Пример списка папок

(1) some test (2) more test 1. PLANT Madrid Two 2013 Folio ltd 2014-27 201-07-98 3M 3M 4M 5M 3M Comp LTD 5028 - Video 6398SRTTGDS 

Я думал что-то вроде сценария bash, который бы даже переместил файлы в новую папку или изменил разрешения. Любые мысли о том, что было бы лучше с объемом данных, папок и пользователя, будут использоваться SFTP для загрузки других папок?

 while IFS= read -r dir; do mv -t path/to/Deny_folder -R -- "$dir" done < list.txt 

или

 while IFS= read -r dir; do chown 700 "$dir" done < list.txt 

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

 $ tr '\n' '\0' <file1 |xargs -0 -I{} mv -vt path/to/deny {} #v for verbose. #OR $ cat file1 |xargs -d'\n' -I{} mv -vit path/to/deny {} # set delimiter to new line 

Для сухого пробега вы можете сделать такой тест

 cat file1 |xargs -d'\n' -I{} echo "mv -vt path/to/deny " {} 

PS: Моя команда mv в RHEL & Debian не распознает параметр -R в mv.

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

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

 $ while IFS= read -r dir; do folders+=("$dir");done < list.txt $ mv -t path/to/Deny_folder -- "${folders[@]}" #-R is not available in Red Hat and Debian 

Или даже сделать своего рода mv-группировку:

 while IFS= read -r dir; do let "a++" folders+=("$dir") [ "$a" -gt 1000 ] && mv -vt path/to/Deny_folder -- "${folders[@]}" && a=1 && unset folders done < list.txt 

Примечание. Перед изменением каталога 500 Гб я проверил следующее в небольшой папке с примерами. Кроме того, я бы сделал резервную копию каталога, прежде чем менять его вообще. Даже если это 500 ГБ, наличие резервной копии бесценно.

 tar -zcvf mybackup.tar.gz big_ol_directory 

Тогда я бы переместил tar.gz, может быть, только на локальную машину или на другую машину в сети, на любую другую машину. Две резервные копии в одном и том же месте не так полезны.

Что касается прав доступа, мне нравится ваша идея разрешений. Другая идея – использовать групповые разрешения для ограничения доступа.

 # ensure that no one has access except the owner (root, your user, whatever) chmod -R 600 big_ol_directory # alternatively # chown -R myuser:companygroup big_ol_directory # chmod -R 660 big_ol_directory # create a group and add a user: # https://www.howtogeek.com/50787/add-a-user-to-a-group-or-second-group-on-linux/ # begin granting access to ftpusers chown -R root:ftpusers big_ol_directory # use 770, 760, 740 as desired (g+rw is x6x) chmod -R g+rw big_ol_directory/public # files in the root of big_ol_directory, including directories # other than public, will still be owner-editable only.