0

復元されたデータを調べるために、フォルダーとファイルを再帰的に調べ、最終的にファイルを実行して、特定のバックアップから完全に復元されたかどうかを確認するスクリプトに取り組んでいます。(復元されたファイルは再生され、mp3 またはその他のオーディオとして識別され、動作しないファイルは ASCII テキストとして識別されます)

今のところ、テストフォルダー構造を調べて、すべてのフォルダーと対応するファイルを印刷するだけで満足できます。(主にテスト用に印刷しますが、スクリプトが現在どこにあり、最後にどれだけ進んだかをログに記録して、何が処理されたかを確認したいためでもあります)

2 つの for ループを使用してみました。1 つはフォルダー用、もう 1 つはファイル用です。(理想的には、1つのフォルダーを取り、そこにあるファイルをリストし(またはサブフォルダーを掘り下げる可能性があります)、各フォルダーの下にそのサブフォルダー内のファイルのみを表示してから、次のように移動します。

Folder1  
- File 1  
- File 2  
    -- Subfolder  
    -- File3  
    -- File4  
Folder2  
- File5  

ただし、これは通常提案されている方法 (for ループなど) では機能しないようです。ディレクトリに「find . -type d」を使用し、「find . -type f」または「find * -type f」を使用するところまで行きました(サブディレクトリに入らないようにするため)ただし、希望どおりに実行されたかどうかを確認するためにパス/ファイルを変更したところ、それが機能しないことが明らかになりました。

最初にすべてのディレクトリを出力し (最初のループ)、次にすべてのファイルを出力するように常に見えました (2 番目のループ)。それが何をしているかを追跡し、何がチェック/回復されたかをより簡単に知るために、上記で説明したように、より整然とした方法でこれを行いたいと思います。それで、私は何か間違ったことをしたのでしょうか、それとも bash の for ループの一般的な制限でしょうか?

関連する可能性のある別の問題: find の出力を配列に割り当てることは機能しているように見えましたが、配列としてアクセスできませんでした ...

ループの例:
for folder in '$(find . -type d)' ; do
echo $folder
let foldercounter++
完了

Arrays: Folders=("$(find . -type d)")
#私の知る限り、これは出力を配列として割り当てる必要があります#しかし、実際には echo "$
folders[1]" のように適切に割り当てられません #機能しません (スペースには引用符が必要です)

4

2 に答える 2

1

復元されたデータを調べるために、フォルダーとファイルを再帰的に調べ、最終的にファイルを実行して、特定のバックアップから完全に復元されたかどうかを確認するスクリプトに取り組んでいます。(復元されたファイルは再生され、mp3 またはその他のオーディオとして識別され、動作しないファイルは ASCII テキストとして識別されます)

fileサブディレクトリなどを含む、現在のディレクトリ内のすべてのファイルとディレクトリで実行する場合は、実行するように指示するforだけでよいため、Bash ループを使用する必要はありません。findfile

find -exec file '{}' ';'

(この-exec ... ';'オプションは、...一致したすべてのファイルまたはディレクトリに対してコマンドを実行し、引数{}をファイルへのパスに置き換えます。)

(ディレクトリではなく) 通常のファイルに対してのみ実行する場合fileは、次のように指定できます-type f

find -type f -exec file '{}' ';'

ディレクトリの名前だけを出力したいが、通常のファイルで上記を実行したい場合は、-or演算子を使用して、 を使用するディレクティブと を使用するディレクティブを接続-type dでき-type fます。

find -type d -print -or -type f -exec file '{}' ';'

編集して追加:必要に応じて、上記のコマンドの効果はfile、再帰的なシェル関数を作成することにより、純粋な Bash (もちろんコマンドも) で実現できます。例えば:

function foo () {
    local file
    for file in "$1"/* ; do
        if [[ -d "$file" ]] ; then
            echo "$file"
            foo "$file"
        else
            file "$file"
        fi
    done
}
foo .

これはfind、ファイルをより一貫してソートし、おそらくドットファイルやシンボリックリンクの処理などの細かい点でコマンドとは異なりますが、大まかに同じであるため、さらに調整するための出発点として使用できます.

于 2013-03-10T21:24:22.220 に答える
1

@H.-Dirk Schmitt が参照していたfind ... -exec ...ソリューションは、次のようになります。

find . -type f -exec sh -c '
    case $(file "$1") in
    *Audio file*)
        echo "$1 is an audio file"
        ;;
    *ASCII text*)
        echo "$1 is an ascii text file"
        ;;
    esac
' _ {} ';'
于 2013-03-10T21:31:11.467 に答える