2016-04-27 5 views
1

In Bash verwende ich ein Array, um die Dateien zu speichern, die ich über reguläre Ausdrücke kopieren möchte. Wie folgt aus:Dateien bei einer Suche mit einem regulären Ausdruck filtern

regex_2=(*.awk *.sh *utf8.txt *new.txt) 
cp "${regex_2[@]}" $root_dest_dir_2 

Aber von Dateien mit der Erweiterung .sh Ich mag ausschließen solche wie diese Endung:

*2016025a.sh *2015039.sh *20150810b.sh 

So ausschließen, die in .sh einen Buchstaben voran enden und mehr als eine Nummer oder endend in .sh mit mehr als einer Nummer vorangestellt.

Das Verzeichnis enthält Dateien wie diese:

dev_execute_fromFTP5.sh --> to copy 
dev_execute_fromFTP5_2016025a.sh -- to exclude 
extrac.sh --> to copy 
execute_fromFTP5NT.sh --> to copy 
execute_fromFTP5NT_20150226.sh --> to exclude 
test5.sh --> to copy 
..... 
+1

Verwenden statt finden. Was genau ist der Unterschied zwischen Dateien, die Sie kopieren möchten und denen, die Sie nicht kopieren? – 123

+0

Unquoted Glob-Muster in Ihrer Array-Initialisierung erweitern die Muster im Voraus. – anubhava

+0

@anubhava Können Sie mir ein Beispiel geben? Ich weiß nicht viel über nicht quoted glob patterns. – Firefly

Antwort

1

können Sie Gnu mit regex finden verwenden

find . -regextype egrep \ 
     -regex ".*\.(awk|sh|utf8\.txt|new.txt)" \ 
     ! -regex ".*([0-9][[:alnum:]]).sh" \ 
     -exec cp {} $root_dest_dir_2 + 
Verwandte Themen