list.txtに基づいてフォルダの権限を変更します。

list.txtに基づいてフォルダの権限を変更します。

SFTP経由でダウンロードするためにサードパーティのアクセス権を付与する必要がある他の多くのフォルダを含む3つの大きなフォルダがあります。

現在、ホームディレクトリのすべてのフォルダにSFTPのダウンロード権限が設定されているので、ユーザーがアクセスできないファイルでlist.txtを作成して権限を設定することが私の考えです。または、このファイルを別のフォルダに移動しますか?

問題のフォルダには、500 GBを超える数百万のファイルを含む2000を超えるフォルダが含まれており、その半分のアクセス権を削除する必要があります。

フォルダ一覧の例

(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:mvRHELとDebianの私のコマンドはmvの-Rオプションを認識しません。

この回避策の1つのトラップは、ファイルのディレクトリ名にディレクトリ名の一部として改行文字が含まれていることです。他のすべての場合(たとえば、スペースがあるディレクトリ名など)では、両方のバージョンがテストされ、正常に動作します。

ループを使用して実行したい場合は、ファイルから読み取った行ごとに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

おすすめ記事