2010-12-23 11 views
13

Dies scheint einfach in Linux, aber ich versuche, die Namen von * .pdf-Dateien innerhalb eines Verzeichnisses und seiner Unterverzeichnisse zu einer Ausgabedatei zu drucken. Ich habe Perl auf meiner Windows-Maschine installiert. Was ist eine einfache Möglichkeit, dies zu tun?Command Line Druck Dateinamen zur Ausgabedatei

Danke, Jake

Antwort

29

Nicht viel anders als Linux.

dir *.pdf > fileyouwant.txt 

Wenn Sie nur die Dateinamen möchten, können Sie das tun, mit

dir/b *.pdf > fileyouwant.txt 

Wenn Sie auch subdirs wollen,

dir/s/b *.pdf > fileyouwant.txt 

Wenn Sie nicht in diesem Verzeichnis sind, mit zu beginnen

dir/s/b C:\Path\*.pdf > fileyouwant.txt 
+0

Dies wird nicht Dateien in Unterverzeichnissen finden. –

+0

Führt 'dir' die rekursive Suche in Unterverzeichnisse durch? –

+1

dir/s/b tut. Sie müssten zuerst in das Ziel-Top-Verzeichnis wechseln. – ysth

0

Mit Perl, Sie sollte fast sicher das File::Find Kernmodul verwenden.

0

Siehe das Modul File::Glob.

Im Einzelnen:

#!/usr/bin/perl 
use File::Glob ':glob'; # Override glob built-in.       
print join("\n",glob("*.pdf")); 
+0

Unterverzeichnisse werden nicht gemacht – ysth

+0

@ysth: mein Schlechter, aber es könnte immer noch nützlich für jemanden sein, also werde ich es verlassen. – robert

1
use strict; 
use warnings; 
use File::Find; 

my $dirname = shift or die "Usage: $0 dirname >outputfile"; 

File::Find::find(sub { 
    print $File::Find::name, "\n" if $File::Find::name =~ /\.pdf\z/ 
}, $dirname); 
+0

Das hat funktioniert, aber kann ich die Ausgabe in eine Datei drucken, nachdem sie mich nach dem Verzeichnisnamen gefragt hat? – Jake

+0

@Jake: Es wurde so geändert, dass der Verzeichnisname als Befehlszeilenparameter verwendet wird, sodass die Ausgabe problemlos an eine Datei gesendet werden kann – ysth

1

File::Find::Rule ist oft schöner zu benutzen als File::Find.

use File::Find::Rule; 

my $rule = File::Find::Rule->file()->name('*.pdf')->start('C:/Path/'); 
while (defined (my $pdf = $rule->match)) { 
    print "$pdf\n"; 
} 

oder einfach

use File::Find::Rule; 

print "$_\n" for File::Find::Rule->file()->name('*.pdf')->in('C:/Path/'); 
Verwandte Themen