2017-04-03 3 views
1

Ich möchte Dateipfade finden, die einer bestimmten Unterzeichenfolge in einem bestimmten Stammverzeichnis entspricht.Wie findet man Pfade, die rekursiv mit einer Unterzeichenfolge in einem Stammverzeichnis übereinstimmen?

Unten ist mein Shell-Skript. Wenn ich eins nach dem anderen teste, sind die Ergebnisse gut. Aber wenn ich eine Schleife mache, ist das Ergebnis leer. Wer kann Tipps geben?

mein Skript

filename=include_pattern 
cat $filename | while read LINE 
do 
    echo $LINE 
    path=$(echo $LINE |cut -d'(' -f2|cut -d')' -f1) 
    echo $path 
    result=$(find . -path $path) 
    echo $result 
done 

include_pattern

ich extrahieren nur den Inhalt der Datei() von

path=$(echo $LINE |cut -d'(' -f2|cut -d')' -f1) 

Nun, ich versuche, einschließlich Wege zu finden Unterzeichenfolge $ path von

find . -path $path 

Das Ergebnis ist leer.

Wenn ich es jedoch durch Standalone in der Befehlszeile versuche, gibt es Pfadlisten zurück. Beispiel:

find . -path '.*/cm-audio/src/main*' 

Ich kann nicht den Grund, warum dieses vollständige Skript nicht funktioniert. Können Sie mir einen Rat geben?

+0

entfernen Sie die ' '' in der Pattern-Datei, zum Beispiel aus 'file ('. */cm-audio/src/main/*')' make 'Datei (. */cm-audio/src/main/*)' - oder - 'finden. -path "$ {path // '}" ' – jm666

+0

Siehe Bearbeiten Teil meiner Antwort – Montmons

Antwort

0

Versuchen Sie folgendes:

filename='text_file_containing_include_pattern_on_each_line.txt' 
while IFS='' read -r line || [[ -n "$line" ]]; do 
    path=$(echo "$line" |cut -d'(' -f2|cut -d')' -f1) 
    find \. -path "${path//\'}" 
done < $filename 

Ah warten .. ich Sie daran gedacht, wo aus einer Text-Datei zu lesen, die Zeilen enthalten wie:

Aber ich sehe jetzt habe ich mich geirrt .. lassen Sie mich anpassen meine Antwort in einer sec ..

EDIT

Falls Sie Ihre include_pattern in einer Variablen gespeichert:

include_pattern="file('.*/cm-audio/src/main/*') 
file('.*/cm-common/include/cm_common/utils/*')" 
for file in $include_pattern; do 
    path=$(echo "$file" |cut -d'(' -f2|cut -d')' -f1) 
    find \. -path "${path//\'}" 
done 
+0

Ich habe noch eine Frage. Wenn einige Pfade mit /.* 'not/*' enden, wie kann ich diesen Ausnahmefall behandeln? Beispiel: '. */Power-manager/PowerManager /.*' –

+0

Beide Pfade sollten korrekt verarbeitet werden, wenn sie in das 'include_pattern' eingetragen werden. Außerdem sollten alle Pfade, die mit '/.*' enden, auch über '/ *' gefunden werden, da der Asterix über jedes verfügbare Zeichen iteriert. Es wird also auch über '.' iteriert. Wenn Sie Ihren Pfad auf '/.*' beschränken, beachten Sie, dass Sie nur versteckte Dateien oder Ordner finden, da diese die einzigen sind, die mit einem '.' beginnen. – Montmons

Verwandte Themen