![根据list.txt更改文件夹的权限](https://linux22.com/image/107499/%E6%A0%B9%E6%8D%AElist.txt%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E6%9D%83%E9%99%90.png)
我有 3 个巨大的文件夹,其中包含许多其他文件夹,我需要授予第三方访问权限以通过 SFTP 下载。
目前主目录中的每个文件夹都设置了SFTP的下载权限,所以我的想法是制作一个list.txt,其中包含用户无法访问的文件,并将权限设置为某些内容?或者将这些文件移动到另一个文件夹?
相关文件夹将包含超过 2000 个文件夹,其中包含数百万个超过 500GB 的文件,我需要删除对其中一半的访问权限
文件夹列表示例
(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
答案1
你可以用这样的东西来避免缓慢的 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 中的命令无法识别 mv 中的 -R 选项。
此解决方案的一个陷阱是文件中的目录名称是否包含换行符作为其目录名称的一部分。在所有其他情况下(即带有空格的目录名称),两个版本都经过测试并且工作正常。
如果你想用循环来完成它,你可以通过避免为文件读取的每一行调用 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
答案2
注意:在修改 500GB 目录之前,我将在一个小示例文件夹上测试以下内容。另外,我会在更改目录之前对其进行备份。尽管有 500GB,但拥有备份是无价的。
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.