2

ディレクトリをクロールし、特定の種類のすべてのファイルをテキストファイルに出力するbashスクリプトを作成しています。私はそれを機能させました、それは私が望まないコンソールにたくさんの出力を書き出すだけです(ファイルの名前)

これまでの関連コードは次のとおりです。tmpFileは私が書き込んでいるファイルです。

for DIR in `find . -type d` # Find problem directories
do
        for FILE in `ls "$DIR"` # Loop through problems in directory
        do
                if [[ `echo ${FILE} | grep -e prob[0-9]*_` ]]; then
                        `echo ${FILE} >> ${tmpFile}`
                fi
        done
done

私がテキストファイルに入れているファイルは、正規表現prob [0-9] * _(prob12345_01のようなもの)で記述された形式です。

echo $ {FILE}からの出力をgrepにパイプする場合でも、stdoutに出力されますが、これは避けたいものです。簡単な修正だと思いますが、私は逃げています。

4

3 に答える 3

3

これはすべて、1つのfindコマンドで実行できます。このことを考慮:

find . -type f -name "prob[0-9]*_*" -exec echo {} >> ${tmpFile} \;

編集:

さらに簡単:( @GlennJackmanに感謝します)

find . -type f -name "prob[0-9]*_*" >> $tmpFile
于 2012-04-24T19:32:18.230 に答える
3

-q特定の質問に答えるために、サイレント出力のためにgrepに渡すことができます。

if echo "hello" | grep -q el; then
  echo "found"
fi

ただし、すでにfindを使用しているため、これは1つのコマンドで実行できます。

find . -regex ".*prob[0-9]*_.*" -printf '%f\n' >> ${tmpFile}

findの正規表現はパス全体で一致するため、先頭と末尾.*が必要になります。

スクリプトが実行している-printf '%f\n'ことと一致するように、ディレクトリなしでファイル名を出力します。

于 2012-04-24T19:42:32.703 に答える
1

コマンドreadの出力では、返さ れたすべてのエントリについて、その場所にあるすべての()ファイルを取得し 、そのファイル名が目的のパターンと一致するかどうかを確認してから 、追加します。 tmpfileにfind
find*

while read -r dir; do
    for file in "$dir"/*; do  # will not match hidden files, unless dotglob is set
        if [[ "$file" =~ prob[0-9]*_ ]]; then
            echo "$file" >> "$tmpfile"
        fi
done < <(find . -type d)

しかしfind、それだけでそれを行うことができます
anubhavaは私をそこに連れて行きました;)
それがどのように行われたかについて彼の答えを見てください

于 2012-04-24T19:31:28.430 に答える