
特定のフォルダ内のすべてのファイルを読み書きできるように権限を変更しようとしていますが、ファイルに「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
まったく実行されません。chmod
grep
すでに権限を持つファイルをスキップするには、次の手順を実行します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
/etc
find
chmod
したがって、誰でも書き込み可能なディレクトリではこれらのコマンドを実行したくありません。
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
も-0
GNU拡張ですが、現在他の実装で広く使用されており、POSIX規格の次のバージョンでも登場する可能性があります。