2009-11-11 11 views

Odpowiedz

7

W pliku Perl,

my @files = <*.aspx>; 
for $file (@files) { 

     # do something. 

} 

<*.aspx> nazywa się glob.

+0

To działa, ale jest konieczne tylko wtedy, gdy nie masz powłoki, która wykonuje zadanie dla ciebie (lub skrypt jest uruchamiany przez program uruchamiający GUI, być może) - i nie jest aż tak elastyczny, nawet jeśli wykonuje zadanie. –

+0

Dzięki za komentarz. Ale ponowna odpowiedź na pytanie, myślę, że ta odpowiedź nie wymaga kwalifikacji. Poza tym wolałbym, aby "uzyskać wszystkie pliki z rozszerzeniem .aspx" wewnątrz samego programu, zamiast korzystać z wiersza poleceń. –

+0

@ Jonathan: Jest prawdopodobne, że OP działa w systemie Windows, używając powłoki 'cmd'. O ile pamiętam, 'cmd' nie robi ekspansji wieloznacznej, jak robią to powłoki Uniksa. –

1

Jeśli używasz komputera z systemem Linux, możesz spróbować czegoś takiego.

for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done 
+1

bezużyteczne użycie ls. - dla i in/tmp/* – ghostdog74

+0

W rzeczywistości powinno być './*. aspx', aby odpowiedzieć na pytanie. –

+0

Używam ls bardzo przydatne w przypadkach, w których chcesz przetwarzać pliki w określonej kolejności. Na przykład ls -tr ./*.aspx uruchomi skrypt perla dla wszystkich plików w kolejności, w jakiej zostały zmodyfikowane. – Ari

3

można przekazać te pliki do perl z zamiennika

w skrypcie

foreach (@ARGV){ 
    print "file: $_\n"; 
    # open your file here... 
     #..do something 
    # close your file 
} 

na linii poleceń

$ perl myscript.pl *.aspx 
+3

W systemie Windows @ARGV będzie mieć tylko jeden element: "* .aspx". – n0rd

-2

Można także przekazać ścieżkę gdzie masz Pliki aspx i czytać je jeden po drugim.

#!/usr/bin/perl -w 

use strict; 

my $path = shift; 
my @files = split/\n/, `ls *.aspx`; 

foreach my $file (@files) { 
     do something... 
} 
+1

Nie musisz używać powłoki ls, która może nie być poprawnym poleceniem w niektórych systemach. –

+0

Nawet w systemach, w których 'ls' jest dostępny, jest to niewłaściwe narzędzie do używania tutaj i ma [wiele dobrze udokumentowanych problemów] (http://mywiki.wooledge.org/ParsingLs). Perl ma wbudowany globbing, po prostu 'foreach my $ file (<*.aspx>)' lub jeśli twoje potrzeby są nieco bardziej skomplikowane, jako szkielet dla kodu, 'opendir' katalog i zapętlaj pliki, robiąc' next unless/\.aspx $/'u góry wewnątrz pętli. – tripleee

2

Można użyć glob wyraźnie, używać parametrów powłoki bez zależności znacznie na zachowanie powłoki.

for my $file (map {glob($_)} @ARGV) { 
    print $file, "\n"; 
}; 

Być może trzeba będzie kontrolować możliwość duplikacji nazwy pliku z rozszerzonymi parametrami.

0

Dla prostego jedną wkładką z -n lub -p, chcesz

perl -i~ -pe 's/foo/bar/' *.aspx 

-i~ mówi zmodyfikować każdy plik docelowy w miejscu i pozostawić oryginalny jako zapasową z ~ przyrostek dodawany do pliku Nazwa. (Pomiń przyrostek, aby nie zostawić kopii zapasowej, ale jeśli nadal uczysz się lub eksperymentujesz, to jest zły pomysł, usunięcie kopii zapasowych, gdy skończysz, jest znacznie mniej kłopotliwe niż przywracanie oryginałów z kopii zapasowej, jeśli coś zepsuć.)

Jeśli kod Perl jest zbyt skomplikowane dla jednej liniowej (lub po prostu na tyle użyteczny do ponownego wykorzystania) oczywiście zastąpić -e '# your code here' z scriptname.pl ... chociaż to może byłaby scriptname.pl więc, że akceptuje listę argumentów nazw plików, i po prostu użyj scriptname.pl *.aspx, aby uruchomić go na wszystkich plikach *.aspx w bieżącym katalogu.

Jeśli potrzebujesz powtórzyć strukturę katalogów i znaleźć wszystkie pliki o określonym wzorcu nazewnictwa, przydatne jest narzędzie find.

find . -name '*.aspx' -exec perl -pi~ -e 's/foo/bar/' {} + 

Jeśli Twój find nie obsługuje -exec ... + spróbować z -exec ... \; chociaż to będzie wolniejszy i uruchomić więcej procesów (po jednym w każdym pliku znajdziesz zamiast tak mało, jak to możliwe, aby przetworzyć wszystkie pliki).

jedynie zeskanować kilka katalogów, wymienić . (których nazwy bieżący katalog) z rozdzieloną spacjami listą z katalogów w celu zbadania, czy nawet użyć find znaleźć sobie (i to może badać -execdir do robienia czegoś w katalogach każdy katalog, który wybiera find ze złożoną, skomplikowaną, krytyczną z biznesowego punktu widzenia, może tajną listą predykatów opcji find).

Być może także przeglądaj find2perl, aby wykonać tę rekursję katalogu natywnie w Perlu.

0

Na przykład, aby obsłużyć perl scriptname.pl *.aspx *.asp

w Linuksie: Powłoka rozszerza symbole wieloznaczne, więc Perl może po prostu być

for (@ARGV) { 
    operation($_); # do something with each file 
} 

Windows nie rozwiązuj kwantyfikatorów więc rozwinąć symboli wieloznacznych w każdego argumentu w Perl jak następuje. Pętla for następnie przetwarza każdy plik w taki sam sposób jak powyżej

for (map {glob} @ARGV) { 
    operation($_); # do something with each file 
} 

na przykład, będzie to wydrukować rozszerzoną listę pod Windows

print "$_\n" for(map {glob} @ARGV); 
Powiązane problemy