Suchen Sie nach Dateien mit Ausnahme einiger Verzeichnisse

Suchen Sie nach Dateien mit Ausnahme einiger Verzeichnisse

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 Testingnur im Verzeichnis.

Um einen Befehl auszuführen, fügen Sie -execdie folgende Aktion hinzu:

find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$' -exec echo {} \;

Ersetzen Sie es echodurch 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

verwandte Informationen