Bash

根據 list.txt 更改文件夾的權限

  • March 14, 2017

我有 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

您可以使用類似這樣的方法來避免緩慢的 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

引用自:https://unix.stackexchange.com/questions/351359