Ich habe viele Dateien (mit einer .fna
Erweiterung). 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 -l
Option, dass positive Treffer nur Dateinamen zurückgeben) mitxargs
Sie 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 tr
Befehl reagiert auf seine Eingabe, die in der REPLY
Variable erwartet wird, löscht alles, was kein ist >
, fordert dann dazu auf, wc
die Anzahl der resultierenden Zeichen zu zählen, und vergleicht diese Ausgabe dann mit 9.
Die zweite Zeile führt den mv
Befehl zum Zuordnen von *.fna-Dateien zum (Beispiel-) location
Verzeichnis aus. Zuordnende *.fna-Dateien müssen außerdem den Ausdrucksqualifizierer übergeben, der als Name der von uns definierten Funktion angegeben wird.