指定されたディレクトリからすべてのファイルとディレクトリを取得しようとしていますが、そのタイプ(ファイル/ディレクトリ)を指定することはできません。何も印刷されていません。私が間違ってやっていること、それを解決する方法。指定されたディレクトリのファイルとサブディレクトリを出力する
答えて
readdir
は、パス情報のないノード名のみを返します。パスが指定されていない場合は、ファイルテスト演算子には、現在の作業ディレクトリになりますし、現在のディレクトリが$currNode->rootDirectory
ではないので、彼らは私が提案し
あなたはノードを組み合わせることFile::Spec::Functions
コアモジュールからrel2abs
を使用したことはありませんパスに名前を付けます。文字列連結を使用することもできますが、ライブラリ関数は、ディレクトリがスラッシュで終わっているかどうかのコーナーケースを処理します。
Perlの識別子が最も頻繁にsnake_case
であることを指摘しておく価値があります。大文字を使わないためです彼らは、特にパッケージ名のようにグローバルために予約されているような名前のように、識別子の最初の文字のために避けるべきである
私はあなたのサブルーチンが別の方法で設定することで、この
use File::Spec::Functions 'rel2abs';
sub do_search {
my ($curr_node) = @_;
my $dir = $curr_node->rootDirectory;
opendir my $dh, $dir or die qq{Unable to open directory "$dir": $!};
while (my $node = readdir $dh) {
next if $node eq '.' or $node eq '..';
my $fullname = rel2abs($node, $dir);
print "File: $node\n" if -f $fullname;
print "Directory $node\n" if -d $fullname;
}
}
ようになっているはずだと思います現在の作業ディレクトリを読み込み中のディレクトリにコピーします。その方法は、ファイルパスを操作する必要はありませんが、あなたは保存し、前に、それは
Cwd
コアモジュールはgetcwd
を提供し、あなたのコードは、この
use Cwd 'getcwd';
sub do_search {
my ($curr_node) = @_;
my $cwd = getcwd;
chdir $curr_node->rootDirectory or die $!;
opendir my $dh, '.' or die $!;
while (my $node = readdir $dh) {
next if $node eq '.' or $node eq '..';
print "File: \n" if -f $node;
print "Directory $node\n" if -d $node;
}
chdir $cwd or die $!;
}
のようになります。変更した後、元の作業ディレクトリを復元する必要があります
このCPANモジュールを使用すると、すべてのファイルとサブディレクトリを再帰的に取得できます。
use File::Find;
find(\&getFile, $dir);
my @fileList;
sub getFile{
print $File::Find::name."\n";
# Below lines will print only file name.
#if ($File::Find::name =~ /.*\/(.*)/ && $1 =~ /\./){
#push @fileList, $File::Find::name."\n";
}
これは実際にOPの問題を解決するものではありません。 – Borodin
私は、既に最適化されているため問題を解決しているので、独自のコードを書くのではなく、最初にCPANモジュールを使うべきです。 – AbhiNickz
それはかなり無関係です。あなたはOPがPythonを代わりに使うべきだと思うかもしれませんが、Pythonソリューションは有用ではありません。あなた自身のコードに何が間違っているのか理解させる助けにはなりませんでした。また、非再帰的解決が必要なとき。あなたの出力は元のコードのようなものではなく、使用されていない配列と解読されたセクションがあります。これは貧弱な解決策です – Borodin
すでに答えられていますが、実装の詳細を気にしないほうが便利で、そのような詳細を隠すためにいくつかのCPANモジュールを使うことができます。
このうちの1つは素晴らしいPath::Tinyモジュールです。
としてあなたのコードは次のようになります。children
メソッドが自動的に.
と..
を除く
use 5.014; #strict + feature 'say' + ...
use warnings;
use Path::Tiny;
do_search($_) for @ARGV;
sub do_search {
my $curr_node = path(shift);
for my $node ($curr_node->children) {
say "Directory : $node" if -d $node;
say "Plain File : $node" if -f $node;
}
}
。
-f
のテストは、実際のfiles
の場合にのみtrueとなることをご理解ください。例えば、上記のコードでは、symlinks
(実際のファイルを指すポイント)、またはFIFO
というファイルは除外されています。このような "ファイル"は普通はオープンで読み込めます。したがって、-f
の代わりにいつも便利です-e && ! -d
テストを使用してください(たとえば、ディレクトリは存在しますが、ディレクトリは存在しません)。
Path::Tiny
にはいくつかの方法があります。例えば - あなたはis_file
方法は通常DWIMある
for my $node ($curr_node->children) {
print "Directory : $node\n" if $node->is_dir;
print "File : $node\n" if $node->is_file;
}
を書くことができする:-e && ! -d
。Path::Tiny
あなたも簡単にiterator
方法を使用してツリー全体を歩いて、あなたの機能を拡張することができ使用
:上記
use 5.014;
use warnings;
use Path::Tiny;
do_search($_) for @ARGV;
sub do_search {
#maybe you need some error-checking here for the existence of the argument or like...
my $iterator = path(shift)->iterator({recurse => 1});
while(my $node = $iterator->()) {
say "Directory : ", $node->absolute if $node->is_dir;
say "File : ", $node->absolute if $node->is_file;
}
}
は、再帰的なダウン与えられた引数からすべてのファイルとディレクトリのタイプを印刷し...
など... Path::Tinyは本当にインストールしておく価値があります。
- 1. Linux:ディレクトリ(サブディレクトリを含む)から指定されたフォルダにtxtファイルでコピーされたファイルをコピーする
- 2. コマンドラインで指定された出力ファイルへの出力
- 3. Qt出力ディレクトリの指定
- 4. 複雑な出力を指定されたディレクトリにリダイレクトするためのScalaJS
- 5. ConfuserEx CLI指定された出力ディレクトリがありません
- 6. ls指定されたディレクトリの指定された型の最初のファイル
- 7. 出力データをpath1で指定されたディレクトリに入れる方法は?
- 8. 特定のディレクトリとそのサブディレクトリからのパスを持つ検索指定ファイル
- 9. プロジェクトビルドの出力と「Build Action:Content」とマークされたファイルをディレクトリ
- 10. リンクのある限定されたディレクトリとサブディレクトリ一覧
- 11. 出力をVARで指定されたファイル名にリダイレクト
- 12. 正規表現マッチ指定されたディレクトリのすべてのサブディレクトリが、除外するディレクトリ
- 13. シェル指定されたディレクトリ内のファイルとそのファイルまたはディレクトリをリストするスクリプト
- 14. は、「指定された入力ファイル」 - PHP
- 15. ディレクトリとサブディレクトリのファイルをスキャンする
- 16. .txtファイルのディレクトリとサブディレクトリをスキャンする
- 17. Directory.EnumerateFilesメソッド:指定されたサブディレクトリ内のファイルを列挙する方法?
- 18. cython出力ファイルを指定する
- 19. ASP.Netコア1指定されたディレクトリにファイルをリストします
- 20. 特定のサブディレクトリにファイルとディレクトリを追加する
- 21. 指定されたディレクトリへのjarの抽出
- 22. サブディレクトリとパイプ入力を出力ファイルにループする方法
- 23. bash:ファイルが指定されていない場合にファイルまたは標準出力に出力する
- 24. 指定されたディレクトリ内のバッファファイル名
- 25. Gradle 4のクラス出力ディレクトリを指定する方法は?
- 26. Flavorに固有の出力ディレクトリを指定するAndroid Studio Gradle
- 27. 指定された順序でメッセージ出力を累積する
- 28. 'zip'コマンド出力の宛先ディレクトリを指定します(作成されるZipファイル)
- 29. サブディレクトリとサブディレクトリ(php)にあるファイルを含むディレクトリとファイルを削除します
- 30. Bash:指定されたファイルのないサブディレクトリを見つけよう
与えられたソリューションをありがとう。最初の1つは私の問題を解決した:) –