Lassen Sie uns sagen , dass ich in einem Verzeichnis bin , die einige Unterverzeichnisse hat, dir1
, dir2
, und dir3
. Jedes dieser Verzeichnisse hat eine Datei, foo
und ich möchte für jedes foo
Verzeichnis in jedem der Verzeichnisse denselben Befehl ausführen und diesen Befehl in diesem Verzeichnis ausführen lassen .
Wenn ich es "von Hand" machen würde, würde es ungefähr so aussehen:
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
Der Befehl muss unbedingt in jedem der Verzeichnisse ausgeführt werden . foo
ist ein Stapelplanungsskript (für HTCondor, wenn Sie es wissen möchten) und muss von jedem Unterverzeichnis ausgeführt werden, damit die Ausgabe der von den Planungsskripten gestarteten Läufe in jedem Unterverzeichnis landet.
Die Frage " Eine Datei suchen und einen Befehl im Verzeichnis der Datei ausführen " beantwortet meine Frage nicht, soweit ich das beurteilen kann. Die erste Antwort auf diese Frage ist eher eine Problemumgehung, die in meinem Fall nicht funktioniert, und die zweite Antwort enthält nicht genügend Erklärungen, damit ich weiß, wie man sie verwendet.
Antworten:
Angenommen, Sie
find
unterstützen dies, verwenden Sie die-execdir
Option anstelle von-exec
Wenn dies nicht der Fall ist, geben Sie bitte Details zu Ihrer Plattform und / oder Distribution an (falls zutreffend).
quelle
{}
, sondern dem Elternteil von{}
.-exec
mir , aber der angegebene Befehl wird aus dem Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält " angegeben.Angenommen, Sie wissen genau, in welchen Verzeichnissen Sie Ihren Befehl ausführen sollen.
oder Schleifen über die
foo
Dateien,Die Subshell verhindert
cd
, dass das Arbeitsverzeichnis des restlichen Skripts beeinflusst wird. Die${foo%/*}
Parametersubstitution wird auf den Namen des Verzeichnisses erweitert, in dem sich diefoo
Datei befindet (indem alles nach dem letzten/
im Wert von entfernt wird$foo
).Verwenden Sie Standard
find
, um dasselbe zu tun (für den Fall, dass sich diefoo
Dateien möglicherweise tief in einer Verzeichnisstruktur befinden):In Worten: Suchen Sie alle regulären Dateien mit dem Namen "foo" irgendwo im aktuellen Verzeichnis oder darunter und geben Sie diesem Shell-Skript ihre Pfadnamen in Stapeln. Das Shell-Skript muss die angegebenen Pfadnamen durchlaufen, das Verzeichnis in den Verzeichnisabschnitt jedes Pfadnamens ändern und in diesem Fall ausführen
somecommand foo
.Eine Lösung, die den Nichtstandard verwendet
-execdir
, finden Sie in der Antwort von roaima . Seine Antwort passte sich meinem Beispiel an:quelle