Verschieben Sie Dateien, die ein Muster eine bestimmte Anzahl von Malen enthalten

Verschieben Sie Dateien, die ein Muster eine bestimmte Anzahl von Malen enthalten

Ich habe viele Dateien (mit einer .fnaErweiterung). Ich muss sie verschieben, wenn sie das Zeichen>eine bestimmte Anzahl von Malen.

Ich weiß, welche Dateien enthalten>eine bestimmte Anzahl von Malen (in diesem Beispiel 9 Mal) mit diesem Befehl.

grep -c ">" *.fna | grep ":9"

Das Ergebnis ist wie folgt

5242_ref.fna:9
9418_ref.fna:9

Aber ich weiß nicht, wie ich diese Dateien in einen anderen Ordner verschieben kann.

Danke.

Antwort1

Durch die Kombination egrep(aufgerufen mit der -lOption, dass positive Treffer nur Dateinamen zurückgeben) mitxargsSie können beliebige Befehle basierend auf Textübereinstimmungen ausführen:

[gnubeard@mothership: ~/mver]$ ls
destination  example.fna  non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>>>>>>>>
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ egrep -l '>{9}' *.fna | xargs -I{} mv {} destination/
[gnubeard@mothership: ~/mver]$ ls
destination  non_example.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna

Bearbeiten: Dies stimmt nicht mit Dateien überein, die eine bestimmte Anzahl von Vorkommen eines Zeichens aufweisen, wenn diese durch andere Zeichen oder Zeilenumbrüche getrennt sind. Ich habe dieses kurze Skript erstellt, das wie gewünscht funktionieren sollte.

#! /usr/bin/env bash

DESTINATION=./destination
MATCH_CHAR='>'
MATCH_COUNT=9

for FILE in $1; do
  MATCHES=$(grep -o $MATCH_CHAR $FILE | wc -l)
  if [ $MATCHES -eq $MATCH_COUNT ]; then
    mv $FILE $DESTINATION
  fi
done

Beispiel:

[gnubeard@mothership: ~/mver]$ ls
destination  example.fna  mver  non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>
>>foo>>bar>>>baz
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ ./mver *.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna
[gnubeard@mothership: ~/mver]$ ls
destination  mver  non_example.fna

Antwort2

Sie können zsh mit seinemAusdruck als Glob-Qualifiziererum Dateien auszuwählen, die nur neun solcher Symbole haben:

$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/

Die erste Zeile definiert eine Funktion, deren Zweck es ist, einen True/False-Filter für Dateien zu erstellen, die neun >Symbole enthalten. Der trBefehl reagiert auf seine Eingabe, die in der REPLYVariable erwartet wird, löscht alles, was kein ist >, fordert dann dazu auf, wcdie Anzahl der resultierenden Zeichen zu zählen, und vergleicht diese Ausgabe dann mit 9.

Die zweite Zeile führt den mvBefehl zum Zuordnen von *.fna-Dateien zum (Beispiel-) locationVerzeichnis aus. Zuordnende *.fna-Dateien müssen außerdem den Ausdrucksqualifizierer übergeben, der als Name der von uns definierten Funktion angegeben wird.

verwandte Informationen