2017-01-15 9 views
1

タスク(12)here.表示構成ファイル

からのgrepを使用して、私は次のようにこのタスクを解決することができます:

grep --no-message -l [[:alnum:]] /etc/* | grep [[:digit:]] 

同様の結果を

ls -o /etc/ | grep ^- | awk '{print $8}' | grep [[:digit:]] 

しかし、私は各ディレクトリのすべてのファイルを再帰的に読みたいと思っています。これは私ができることです:

grep --no-message -lR [[:alnum:]] /etc/* | grep [[:digit:]] 

また、この課題は今日解決できますか?これは正しい方法ですか?このタスクを解決するために提供できる追加のソリューションにはどのようなものがありますか?

+0

ファイルのコンテンツまたはファイル名を検索しますか? – codeforester

+0

ファイル名を検索したい。 – kurgulus

答えて

0

グリッサとアンドレイは完璧な答えを与えてくれました。ただし、grepを使用するソリューションを探している場合はここをクリックしてください。

while read -r filepath; do 
    # grep for digits in the basename so that we choose only those 
    # files that have a digit in them, not in any parent directory name 
    if grep -q '[[:digit:]]' <<< "$(basename $filepath)"; then 
    echo "$filepath" 
    fi 
done < <(find /etc -type f -print) 

全く効率的ではありません。

+0

@kurgulus私の2番目の答えを確認してください – Andrey

1

あなたはfindを使用することができます。

find /etc -type f -name \*[[:digit:]]\* 

、ない完全なパスの桁と、このコマンドリストは、ファイルだけということに注意してください。後者の場合は、別のフィルタを使用してください:

find /etc -type f -path \*[[:digit:]]\* 
2

grepにファイル名を取得するだけではいけません。

:代わりに、私は目標が数値でファイルをリストすることですので、あなたはあなただけ

echo /etc/* 

を行うことができます

grep --no-message -l [[:alnum:]] /etc/* 

でやろうとしていると思うもののつまりは、次のようなグロブを使用することができます

shopt -s globstar 
echo /etc/**/*[[:digit:]]* 
:あなたが再帰的にこれをしたい場合は
echo /etc/*[[:digit:]]* 

あなたのようなbashでそれを行うことができます

それとも、findを使用することができます。

find /etc -name '*[[:digit:]]*' 
+1

'echo'は、間に改行を入れる 'find'とは異なり、すべてのファイルを1行にリストすることに注意してください。パイプ 'echo'は' xargs -nX'に出力され、X列の出力が表示されます。 – codeforester

0

タスクは純粋なgrepソリューションを持っている場合は、ここにある:

grep -laR . /etc | grep '^.*/[^/]*[[:digit:]][^/]*$' 

正規表現:

  1. ^...$フルラインをカバーする;
  2. .*/[^/]*...[^/]*ファイル名のみを検索してください。
関連する問題