「DATA」文字を含むフォルダ内のすべてのファイルに対する権限を読み取り/書き込みに設定しますか?ロッキーLinux

「DATA」文字を含むフォルダ内のすべてのファイルに対する権限を読み取り/書き込みに設定しますか?ロッキーLinux

特定のフォルダ内のすべてのファイルを読み書きできるように権限を変更しようとしていますが、ファイルに「DATA」という文字列が必要です。

このコマンドを試してみましたが、どのようにフィルタリングするのかわかりません。 grepを使うべきですか?

grep -nr DATA | chmod u=rw,g=rw,o=rw  *

答え1

今削除された質問へのコメントで述べたようにスタックオーバーフロー:

grep -rl DATA "foldername" | xargs -n1 chmod =rw 

...警告:ファイル名にスペースが含まれていると機能しません。

私はあなたが実際の生活に参加する前に、Linux / Unixツールバーのチュートリアルをたくさん読んで、ツールがどのように連携するかを理解することを強くお勧めします。

あなたの呼び出しはすべてを変更しますが、デフォルトではchmod何も出力されないので、grep何も出力しません。何もない

あなたは何ですか必要私の例に示すように、必要なのはその中にあるファイルを見つけてDATAその権限を変更することだけです。

答え2

chmodファイルに「DATA」文字列が含まれている場合は、ディレクトリ内のすべてのファイルを再帰的に検索して実行できます。

perm.sh:

#!/bin/bash

grep -w "DATA" "$1" && chmod 666 "$1"

find一般ファイルを再帰的に検索する場合(ありがとうございます。スティーブン)

find <path/of/folder> -type f -exec bash </path/of/perm.sh> {} \;

答え3

すでに使用しているGNU-r拡張のおかげで、grep次のことができます。

grep -rlZ DATA . | xargs -r0 chmod a=rw

正規表現に一致する行は、1つ以上のファイルを一覧表示するために-l使用されます。 (GNUgrep l拡張子でもあります-Z)出力を後処理するために、NULで区切られたファイルパスを印刷します。

xargs -0²通過するには、NULで出力を分割します。別のパラメータとしてユーティリティにchmod。 ²の場合、-r入力が空の場合(ファイルパスが報告されない)、xargsまったく実行されません。chmodgrep

すでに権限を持つファイルをスキップするには、次の手順を実行しますrw-rw-rw-

find . -type f ! -perm a=rw -exec grep -lZ DATA {} + |
  xargs -r0 chmod a=rw

移植可能な方法は次のとおりです。

find . -type f \
       ! -perm a=rw \
       -exec grep -q DATA {} ';' \
       -exec chmod a=rw {} +

ただし、grep各ファイルが1つずつ実行されるため、効率が大幅に低下します。

とにかく、世界に書き込み可能なデータファイルを持つことは非常に悪い考えのように聞こえます。

またchmod、ファイルの権限を変更するときにシンボリックリンクに従うため、ファイルが通常のファイルからユーザーへの/etc/shadowシンボリックリンクに変更された場合~/.bashrc(またはシンボリックリンクへの変更が./dirある場合)、ファイルは次の間で検出され実行されます。間違ったファイルの権限を変更する可能性があります。./dir/shadow/etcfindchmod

したがって、誰でも書き込み可能なディレクトリではこれらのコマンドを実行したくありません。

GNU/Linux システムを使用している場合は、次の方法zshでこれらの問題を回避できます。

find . -type f ! -perm a=rw -execdir zsh -c '
  zmodload zsh/system || exit
  for file do
    sysopen -o nofollow -u0 -- $file &&
      grep -q DATA &&
      chmod a=rw /dev/stdin
  done' {} +

ディレクトリツリーを下げると、Whereはfindシンボリックリンクに従わないように注意し、-execdirコマンド(ここzsh)を使用して見つかったファイルを含むディレクトリで実行します。シンボリックリンク(ption)zshに従わずにファイルを開くことを担当し、Linuxでは、ファイルが削除されたか名前が変更された場合でも、開かれた実際のファイルを指すことを保証されるオープンファイルを指す魔法のシンボリックリンクです。nofollow o/dev/stdin/dev/stdin


他のいくつかの機能はgrep現在サポートされていますが、ディレクトリの省略は-rほとんど許可されておらず、.最新バージョンのGNUでは/度を使用するgrepときにデフォルトでディレクトリを使用します。-r-R

²-r-0GNU拡張ですが、現在他の実装で広く使用されており、POSIX規格の次のバージョンでも登場する可能性があります。

関連情報