Ich arbeite mit folgender Verzeichnisstruktur:
onathan@Aristotle:~/EclipseWorkspaces/ShellUtilities/ShellUtilities$ ls -R
.:
calculateTargetDay CustomizeIso ec makeExecutable Models modifyElementList Sourced test file Testing valrelease
./Models:
testcase
./Sourced:
colors stddefs stdFunctions SupportTesting
./Testing:
test testCalculateTargetDay testColors testModifyElementList testStddefs testStdFunctions testSupportTesting tst
Ich möchte einen Befehl für alle Dateien im obersten Verzeichnis und im Verzeichnis ausführenTestenIch möchte den Befehl nicht auf die Dateien in den Verzeichnissen anwendenQuelleUndModelle. Dazu habe ich den folgenden Befehl ausgeführt:
find . -name Sourced -prune -name Models -prune ! -name '\.*' -execdir echo '{}' \;
In diesem Beispiel wurde der Befehl für keine der Dateien in der Verzeichnisstruktur ausgeführt.
Als ich den folgenden Befehl für dieselbe Verzeichnisstruktur ausführte:
find . ! -name '\.*' -execdir echo '{}' \;
Ich habe das folgende Ergebnis erhalten
./calculateTargetDay
./CustomizeIso
./Testing
./testModifyElementList
./test
./testColors
./testStdFunctions
./testCalculateTargetDay
./testStddefs
./testSupportTesting
./tst
./test file
./modifyElementList
./ec
./Sourced
./stdFunctions
./stddefs
./SupportTesting
./colors
./valrelease
./Models
./testcase
./makeExecutable
Wie Sie sehen, kann ich einen Befehl für den Verzeichnisbaum ausführen und ihn auf alle Dateien anwenden, oder ich kann versuchen, selektiv vorzugehen und am Ende keine Dateien auszuführen. Wie kann ich die selektive Anwendung eines Befehls erreichen, den ich brauche?
Antwort1
Sie können dies mit Regex aus dem übergeordneten Verzeichnis tun:
find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$'
\./([^/]+|Testing/.*)$
findet alle Dateien ( -type f
) im aktuellen Verzeichnis und Testing
nur im Verzeichnis.
Um einen Befehl auszuführen, fügen Sie -exec
die folgende Aktion hinzu:
find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$' -exec echo {} \;
Ersetzen Sie es echo
durch Ihren tatsächlichen Befehl.
Beispiel:
$ find . -type f
./foo
./Sourced/src
./Testing/test
./bar
./spam
./Models/model
$ find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$'
./foo
./Testing/test
./bar
./spam
$ find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$' -exec echo {} \;
./foo
./Testing/test
./bar
./spam