複雑なファイル操作についての質問

このQ&Aのポイント
  • ドライブD内で特定の条件を満たすフォルダを探して移動する方法についての質問です
  • PHPを使用して再帰処理を試みましたが、フォルダ数が多くなると制限に達しました
  • プログラミングやバッチ処理を利用して、条件に一致するフォルダを特定のフォルダに移動する方法を教えてください
回答を見る
  • ベストアンサー

複雑なファイル操作

例えば沢山のフォルダが入ったドライブDから、”画像ファイル(jpgと仮定)以外のファイル及びフォルダを含まないフォルダ(中に画像ファイルしか含んでいないフォルダ)”を探査して条件に一致する全てのフォルダ(イメージファイルしか入っていないフォルダ)を(D\picturefolder)へ移動”という処理をする場合、何を使うのがよいでしょうか?つまり、これが可能なソフトであるとかバッチ処理であるとかプログラミングであるとかを教えて欲しいです ちなみにプログラミングはPHPだけは独学である程度出来るのですが、コマンドラインでの再帰処理で実現しようと思ったのですが上手くいきませんでした。あとPHPの再帰処理は100回が限度なのでフォルダ数うが多くなるとPHPでは手におえません

質問者が選んだベストアンサー

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.3

バッチファイルでサンプルを作ってみました。 Dドライブルートからファイル名に .jpg が含まれるファイルだけがあるフォルダを moveコマンドで D:\picturefolder へ移動するものです。後ろから2行目内で echo move としているので表示状況をみて希望に添っているようなら echo move → move に変更して試してみてください。(間違うとディレクトリがぐちゃぐちゃになる可能性があるので) No.2にさんが指摘されている隠しファイル、システムファイル等は考慮していません。dir /b で表示されるファイル名から.jpgの文字列の有無で判断しています。 また、ドライブDを網羅して調べる都合上、一度実行したあと再度実行すると、D:\picturefolderを検索してしまうので注意が必要です。色々なフォルダからD:\picturefolderに移動させるため、同じフォルダ名がいろいろな階層にあると上書き確認のメッセージが出てきます。 echo off pushd D:\ for /f "delims=" %%d in ('dir /b /s /a:d') do call :sub "%%d" exit /b :sub for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do set jpg_c=%%x for /f "delims=" %%x in ('dir /b %1 ^| find /c /v ".jpg"') do set other_c=%%x :echo %1 :echo %jpg_c% --- %other_c% if %jpg_c% NEQ 0 if %other_c% EQU 0 echo move %1 D:\picturefolder goto :EOF

nasumiso2022
質問者

お礼

すごいです!ありがとうございます! こんな複雑な処理がcmdで出来るなんて知りませんでした 色々しらべてコードの意味もだいたい分かったので色々改変も出来るようになりました 詳しい説明ありがとうございました

その他の回答 (2)

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.2

>画像ファイル(jpgと仮定)以外のファイル及びフォルダを含まないフォルダ(中に画像ファイルしか含んでいないフォルダ)”を探査して たぶん、その検索をしても無意味です。 「画像ファイルしか含まれてないフォルダ」と言うのは、多分、貴方のHDDの中には無いと思います。 見た目に画像ファイルしか入っていないように見えても、フォルダ内には、desktop.ini、Thumbs.dbなどの隠しファイルや、Administrator所有の隠しシステムファイルが存在する可能性が非常に高いです。 desktop.ini、Thumbs.dbなどを無視して(無かった事にして)検索して、何とかしてくれるツールはあるかも知れませんが、流石に「Administratorなど他ユーザーのファイルが、フォルダに混在している場合」には対処できないでしょう。 ぶっちゃけ、コマンドプロンプトで attrib c:\*.* /d /s > filelist.txt って実行して、ハードディスク上の全ファイルのリストfilelist.txtを作成し、エディタでfilelist.txtを開いて「目で確認」するしか方法はありません。 上記コマンドは、隠しファイルもシステムファイルも含めて、Cドライブの全ファイルと全ディレクトリをリストするコマンドです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちょっと確認したいんですが, たとえば ・フォルダfolderA の中にはフォルダfolderB と画像ファイルのみがある ・その「フォルダfolderA の中のフォルダfolderB」の中には画像ファイルがある という場合にはどうなっていてほしいんでしょうか?

nasumiso2022
質問者

補足

folderAには画像ファイルとフォルダファイルの両方があるので探査には引っかかりません、この場合はfolderBのみが移動されます

関連するQ&A

  • PHPで複雑なファイル操作

    コマンドラインでPHPを実行するとして。例えば沢山のフォルダが入ったドライブDから、”画像ファイル(jpgと仮定)以外のファイル及びフォルダを含まないフォルダ(中に画像ファイルしか含んでいないフォルダ)”を探査して条件に一致する全てのフォルダ(イメージファイルしか入っていないフォルダ)を(D\picturefolder)へ移動”という処理をする場合 どうすればいいですか? あるいはこういうのが簡単にできるライブラリなどありますか?教えてください

    • ベストアンサー
    • PHP
  • C++のコンソールアプリケーションと文字コード

    バッチファイルの処理を使って、様々な言語(中国語やキリル文字)や、あまりファイル名としては見られないような(^や%など)記号が含まれるファイルやフォルダについて 検索や、リネーム処理をするバッチファイルを作っていたのですが どうも上記のような、記号を含む文字や、キリル文字を含むフォルダ名ファイル名、また長すぎるパスが存在するとうまく動きません おそらくコマンドプロンプトがShift_JISしか扱えないのと、%に関しては変数の展開が関係していると思うのですが… そこで、この機会にC++のコマンドラインによる実行でそういう例外的な文字列の時も対応してファイル操作ができる プログラムを組みたいと思うのですが 何分無知で申し訳ないのですが C++もコマンドプロンプト上で動く以上、Shift_JISに起因する問題に対処できず、バッチファイルの処理と同じように特殊な文字で 動作が不安定になってしまったりするのでしょうか?教えて下さい Visual Express をインストールして、Windows アプリケーションについて多少調べて、その内部で特殊文字(Shift_JISに出ない文字や記号)の代入と出力 を試してみたところ、うまくいくようなので、もしコンソールアプリケーションで出来ないのであればWindowsアプリケーションの勉強をしようと思っています また、Visual ExpressでC++のプログラムを組む時 コンソールアプリケーションと Windowsアプリケーションを作る時文法が微妙に違うのはどうしてですか? たとえば文字型の変数の宣言に コンソールアプリケーションだと String ○○;ですがWindowsアプリケーションだと^を付けないといけなかったり 同じC++なら文法も同じような気がするのですが? 的外れな質問をしていたらごめんなさい ちなみに、バッチ処理で作ろうと思っていたプログラムは ”ドライブDから、画像ファイル(jpgと仮定)以外のファイル及びフォルダを含まないフォルダ(中に画像ファイルしか含んでいないフォルダ)”を探査して条件に一致する全てのフォルダ(イメージファイルしか入っていないフォルダ)を(D\picturefolder)へ移動、もちろんサブフォルダも含めて全フォルダに関して” というものです、特殊文字の問題以外はクリアできたのですが・・・

  • バッチファイルの使い方について

    このサイトで、両面スキャンした画像ファイルを表面と裏面を別々のフォルダに振り分ける方法を質問して、バッチファイルを使う方法を教えてもらったのですが、上手くいきません。バッチファイルを使うのは初めてなので、どこかまずいところがあるのかと思います。 教えていただいた下記のものそのままでバッチファイルを作り、画像ファイル(jpg)を格納したフォルダに置いてダブルクリックすると、「1」「2」のフォルダができるだけで、画像ファイルは移動せず、2つのフォルダは空のままです。 どこを直せばよいのか教えてください。よろしくお願いします。 set N=1 mkdir 1 mkdir 2 for %%I in (*.jpg) do call :sub %%I goto :EOF :sub move %%I %N% set /a N=3-N goto :EOF

  • バッチファイルへのD&D処理

    バッチファイルで以下の作業を自動化したいと考えていますが、初心者のため上手くいきません。 構想の可否を含め参考になるサイト、例文など教えてください。 環境はWindows Xp SP3です。 [処理] 1.バッチファイルに任意のフォルダをD&D 2.任意のフォルダ内に新規フォルダを作成する(例:写真等) 3.新規作成したフォルダに、任意のフォルダ内にある「.jpg」ファイル全てを移動させる 自分でも全パスを指定してのタイプでしたら作成できるのですが、それだと汎用性がないため、 こちらのタイプに変更したいと考えています。 アドバイスお願いします。

  • ImageMagickでのバッチファイル作成方法

    ImageMagickでの処理を簡単にするためにバッチファイルを 作成しよう思います。 最初動くかどうかを確かめるために convert abc.jpg abc_1.png と記述したバッチファイルをabc.jpgの格納してあるフォルダで 実行したのですがうまく回りません。 コマンドプロンプトで上記を実行するとうまくいきます。 バッチファイルをどのように書き直せばうまくいくのでしょうか? ご教示の程よろしくお願い致します。

  • サブフォルダ内のファイルを全部移動させたい。

    VBScriptのバッチでの作成を考えています。 あるフォルダ(名をFolderとします)の中に、たくさんのサブフォルダが あって、そこにあるファイルをすべてFolderに移動させたいと 思っています。 (ファイルはjpg画像ファイルだけです。) たとえば、Folderの下に、Folder_Bというサブフォルダがあって、 更にその下にFolder_Cがあり、その中には1.jpgというファイルが あったとしたら、バッチ実行後、Folderの直下に1.jpgがあり、 (可能であれば)フォルダはすべて消えているという具合です。 ファイルの移動自体はファイルシステムオブジェクトのFile.Moveで行い、 最後にディレクトリを列挙して削除していけばいいんだろうなという ところはわかります。 しかし、フォルダをサブフォルダも含めてすべて舐めて、そこから ファイルを移動していくというロジックに悩んでいます。 アドバイスいただけないでしょうか。

  • バッチファイルへのD&D

    バッチファイルを作成して、以下の作業の効率化を図ろうと考えていますが、初心者のため、上手くいきません。 アイディアの可否を含めて、参考になるサイト、例文など教えてください。 環境はWindows Xp SP3です。 [作業] 1.バッチファイルに任意のフォルダAをD&Dする 2.フォルダA内にフォルダB-1を作成する。 3.作成したB-1に、フォルダA内の[.jpg]ファイルを移動する 以上 フルパスを指定してのバッチファイルなら自分でも何とか作成できるのですが、 このアイディアのは全くできませんでした。 よろしくお願いします。

  • PHPで関数をCのように使いたい

    ご覧頂きましてありがとうございます。 PHP言語にて、下記のようなプログラムを書くにはどうしたらいいでしょうか? /**Main.php*/ // //jpgの画像を1枚指定する。 // //pictChange(jpgの画像); //画像を加工して表示します。 // //main(jpgの画像); //関数pictChangeにjpgの画像を渡しその都度加工して表示します。 // ただこれだけのことですが、 main関数に分岐と再帰処理が入っているため、今の考えでは、 main.phpとpictChange.phpにファイルを分離して書いています。 また、画像のデータを出力する際に、データのメモリを開放する処理、 main関数からpictChange関数を呼び出す際にPHPではどのようにしたらいいのか、 分からないことだらけです。 お手数ですが、 分かる方がいらっしゃいましたらご教授お願い致します。

    • ベストアンサー
    • PHP
  • VB.NETでの特殊なファイル削除操作

    VB.NETでの特殊なファイル削除操作 フォルダ内に以下例のような撮影された画像ファイル群があり、各ファイル名は撮影時間を元に(年月日_時分秒_ミリ秒)名前付けされたもので、この同じ「秒」内に撮影された2枚目以降のファイルを、プログラム的に削除したいのですが、上手くいきません。 フォルダ内のファイル 20100709_135601_113.jpg 20100709_135601_222.jpg 20100709_135601_316.jpg 20100709_135601_364.jpg 20100709_135602_347.jpg 20100709_135602_425.jpg 20100709_135603_910.jpg 20100709_135605_175.jpg 20100709_135605_251.jpg 20100709_135606_628.jpg 例えば、一番上の13時56分01秒には、4枚撮影されたjpgファイルがありますが、最初に撮影された「20100709_135601_113.jpg」 だけを残し 残りの 「20100709_135601_222.jpg」 「20100709_135601_316.jpg」 「20100709_135601_364.jpg」 のファイルを消し、1秒1ファイルだけにしたいのです。 そしてこの結果を 20100709_135601_113.jpg 20100709_135602_347.jpg 20100709_135603_910.jpg 20100709_135605_175.jpg 20100709_135606_628.jpg としたいのです。 なお、このjpgファイルを作成する側のアプリは触れません。 こちら側のプログラムで、削除処理を行いたいです。 ファイル名定義もこのままです。 135604のように、秒内で存在しないjpgファイルも存在します。 どなたか、よいお知恵をお貸し下さいませ。 どうぞよろしくお願いします。 (WinXP Vb.NET2010)

  • フォルダ内にあるファイルの連番リネーム。

    フォルダ内に決まった数(8枚)のJPG画像が入っていて、その8枚づつ画像の入ったフォルダがたくさんあります。 そのフォルダ内のJPG画像のファイル名はそれぞれ全て違うのですが、フォルダ内にある8枚のJPG画像を全て01.jpg~08.jpgに連番リネームしたいと思っています。 今まではエクスプローラー風フォルダツリーから1個1個フォルダを開けて、中身のJPG画像を全選択して連番にリネームという風にやっていましたが(Namery使用)、例えば中身を変更したいフォルダをD&Dしたらフォルダごとに8枚づつ連番を自動でつけてくれるようなソフト、またはそのような作業が可能なソフトがありましたら教えて下さい。 いくつか試してみましたが期待した結果は得られませんでした、よろしくお願いします。