2016-06-20 13 views
2

Ich bin neu in Bash, und ich versuche, Dateien in einem bestimmten Satz von Ordnern zu finden. Ich möchte einen txt-Bericht für Bilddateien in jedem/check/-Ordner erstellen.Bash: Suchen Sie nach Dateien in bestimmten Ordnern und erstellen Sie dann Ausgabelisten

Hier ist, was ich mit gearbeitet:

# Find images 
for f in */check/ ; do 
    find ./ -iname "*jpg*" -o -iname "*png*" > find_images.txt 
     echo "finished $f" 
done 

ich nicht herausfinden können, wie nur in Unterordner „check“ genannt zu sehen, und ich möchte auch die Variable übergeben, so dass ich getrennt bekommen Textdateien, die nach den übergeordneten Ordnern benannt sind. Irgendwelche Vorschläge?

+0

Verwenden 'finden "$ f"' anstatt 'find /' wenn Sie wollen Durchsuche das 'check'-Verzeichnis von der 'for'-Schleife. Sie müssen auch die Umleitung in diesem Fall korrigieren, um zu vermeiden, dass Sie ständig das selbe 'find_images.txt' –

Antwort

1

Sie sind in der Nähe, aber Sie verwenden $f nicht, die den Namen des Ordners enthält.

# Find images 
for f in */check/ ; do 
    # Removing front-slashes from $f to use in log name 
    # http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion 
    log_f="${f//\//_}" 

    # Only search inside $f, saving results to find_images_[foldername].txt 
    find "$f" -iname "*jpg*" -o -iname "*png*" > "find_images_${log_f}.txt" 

    echo "finished $f" 
done 
0

Verwenden grep Befehl und Rohr mit Befehl find

find . | grep check 
+0

' finden. -type f -regex ". * \. \ (jpg \ | gif \ | png \ | jpeg \)" | Grep-Check " –

0

Die find Befehl Abstützungen für Verzeichnisse Benutzer (Ordner), z.B.

find . -name "check" -type d 

Sie könnten diese Ergebnisse verwenden, um dann nach den gewünschten Dateien zu suchen. Die Variable $ f wird der Name des Ordners sein, verwenden Sie das also im inneren Suchbefehl. Wenn Sie die Ausgabedateien jedes Mal durch die Schleife trennen möchten, verwenden Sie eine Variable im Dateinamen. Die $ f-Variable enthält Schrägstriche im Inhalt, sodass Sie diese im Namen der Ausgabedatei wahrscheinlich nicht verwenden möchten. In meinem Beispiel verwende ich einen Zähler, um sicherzustellen, dass jede Ausgabedatei einen eindeutigen Namen hat.

count=1 
for f in `find . -name "check" -type d` ; do 
    find $f -iname "*jpg*" -o -iname "*png*" > find_images_$count_.txt 
    count=$((count+1)) 
done 
Verwandte Themen