it-swarm.com.de

Verwenden Sie den Befehl find, schließen Sie jedoch Dateien in zwei Verzeichnissen aus

Ich möchte Dateien suchen, die mit _peaks.bed enden, aber Dateien in den Ordnern tmp und scripts ausschließen.

Mein Befehl lautet wie folgt:

 find . -type f \( -name "*_peaks.bed" ! -name "*tmp*" ! -name "*scripts*" \)

Aber es hat nicht funktioniert. Die Dateien im Ordner tmp und script werden weiterhin angezeigt.

Hat jemand Ideen dazu?

77
Hanfei Sun

So können Sie das mit find angeben:

find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*"

Erklärung:

  • find . - Suche aus aktuellem Arbeitsverzeichnis starten (standardmäßig rekursiv)
  • -type f - Geben Sie an find an, dass nur Dateien in den Ergebnissen angezeigt werden sollen
  • -name "*_peaks.bed" - Suchen Sie nach Dateien, deren Name auf _peaks.bed endet.
  • ! -path "./tmp/*" - Alle Ergebnisse ausschließen, deren Pfad mit ./tmp/ beginnt
  • ! -path "./scripts/*" - Schließt auch alle Ergebnisse aus, deren Pfad mit ./scripts/ beginnt.

Testen der Lösung:

$ mkdir a b c d e
$ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
$ find . -type f ! -path "./a/*" ! -path "./b/*"

./d/4
./c/3
./e/a
./e/b
./e/5

Sie waren sich ziemlich nahe, die -name-Option berücksichtigt nur den Basisnamen, wobei -path den gesamten Pfad berücksichtigt =)

173
sampson-chen

Hier ist eine Möglichkeit, wie Sie es tun könnten ...

find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)"
8
alex

Versuchen Sie etwas wie

find . \( -type f -name \*_peaks.bed -print \) -or \( -type d -and \( -name tmp -or -name scripts \) -and -Prune \)

und sei nicht zu überrascht, wenn ich es falsch verstanden habe. Wenn das Ziel ein Exec ist (anstatt zu drucken), ersetzen Sie es einfach durch den Platz.

0
DrC

für mich funktionierte diese Lösung nicht mit einem Befehl, der mit find ausgeführt wurde. Ich weiß nicht genau warum, also meine Lösung

find . -type f -path "./a/*" -Prune -o -path "./b/*" -Prune -o -exec gzip -f -v {} \;

Erklärung: wie sampson-chen mit den Ergänzungen von

-Prune - ignoriert den Verfahrenspfad von ...

-o - Wenn das Ergebnis nicht übereinstimmt, werden die Ergebnisse gedruckt (die Verzeichnisse beschneiden und die verbleibenden Ergebnisse drucken)

18:12 $ mkdir a b c d e
18:13 $ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
18:13 $ find . -type f -path "./a/*" -Prune -o -path "./b/*" -Prune -o -exec gzip -f -v {} \;

gzip: . is a directory -- ignored
gzip: ./a is a directory -- ignored
gzip: ./b is a directory -- ignored
gzip: ./c is a directory -- ignored
./c/3:    0.0% -- replaced with ./c/3.gz
gzip: ./d is a directory -- ignored
./d/4:    0.0% -- replaced with ./d/4.gz
gzip: ./e is a directory -- ignored
./e/5:    0.0% -- replaced with ./e/5.gz
./e/a:    0.0% -- replaced with ./e/a.gz
./e/b:    0.0% -- replaced with ./e/b.gz
0
Al3x

Sie können unten versuchen:

find ./ ! \( -path ./tmp -Prune \) ! \( -path ./scripts -Prune \) -type f -name '*_peaks.bed'
0
Jacky Jiang