• ベストアンサー

powershellでフォルダのリネーム

フォルダの先頭のファイル(1が最初)をフォルダ名としたい場合、どんな式になるんでしょうか? 必要な要素は以下だと思います。 1:リネーム対象のフォルダ名 2:フォルダ内の先頭のファイル名 1を2で置き換えたいのです フォルダ1 └file1 └file2 フォルダ2 └hoge1 └hoge2 file1 └file1 └file2 hoge1 └hoge1 └hoge2 こういう結果にしたいのですが、可能ですか? get-childrenでフォルダ一覧が取得出来ますが、そこから進展がないです。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.4

回答No.2をperlで組んだらこんな感じになりました。 powershell でも似たようなプログラムを組むことになるんじゃないかと思います。 printはデバッグの名残なので、全部無くても構いません。 少しpowershellの文法を見てみましたが、配列に追加する += とか、配列をソートする Sort-Object とかあるのでほとんどそのまま移植できそうな気がしました。 ただ、if修飾子(後置if)は無いっぽいのでそこは普通のif文にしなきゃいけないかもです。 #perlでは、単純変数は $x、配列変数は @x のように書いて使い分ける必要があります。 #$debug = 0; にすれば、表示が少し減ります。 あ、リネーム後の名前がかぶった時の処理をしてませんでした かぶった場合、rename がエラーになって元ディレクトリ名のまま残ることになります。 ---ソース(ren_dir.pl)---- use strict; my $debug = 1; my @dirs = (); opendir(DIR, "." ) || die "Can't open current dir. \n"; foreach (readdir(DIR)) { next if (/^\.{1,2}/); # "."(カレント)、".."親ディレクトリ はスキップ if (-d) {push(@dirs, $_)}; # ディレクトリのみリストに追加 } closedir(DIR); foreach my $dir (@dirs) { my @files = (); print "dir $dir\n"; opendir(DIR, "./$dir" ) || die "Can't open dir. $dir\n"; foreach my $file (readdir(DIR)) { print "file $file\n" if $debug; if (-f "./$dir/$file") { print "add $file\n" if $debug; push(@files, $file); # ファイル名ならリストに加える }; } @files = sort @files; # ファイル名リストのソート print "files: @files\n" if $debug; my $to_name = shift @files; # 最初のファイル名を取り出す print "rename $dir to $to_name\n\n"; rename($dir, $to_name); } ----実行結果---- C:\Users\xxxxxxxx\Desktop\perl\ren_dir>dir ドライブ C のボリューム ラベルは OS です ボリューム シリアル番号は 44FA-B451 です C:\Users\xxxxxxxx\Desktop\perl\ren_dir のディレクトリ 2021/01/12 15:31 <DIR> . 2021/01/12 15:31 <DIR> .. 2021/01/12 15:25 <DIR> abc 2021/01/12 14:27 <DIR> def 2021/01/12 15:35 828 ren_dir.pl 2021/01/12 15:25 <DIR> xyz 1 個のファイル 828 バイト 5 個のディレクトリ 163,903,242,240 バイトの空き領域 C:\Users\xxxxxxxx\Desktop\perl\ren_dir>perl ren_dir.pl dir abc file . file .. file test2.txt add test2.txt file test3.txt add test3.txt file test4.txt add test4.txt files: test2.txt test3.txt test4.txt rename abc to test2.txt dir def file . file .. file testb1.txt add testb1.txt file testb2.txt add testb2.txt file testb3.txt add testb3.txt files: testb1.txt testb2.txt testb3.txt rename def to testb1.txt dir xyz file . file .. file testc1.txt add testc1.txt file testc2.txt add testc2.txt file testc3.txt add testc3.txt files: testc1.txt testc2.txt testc3.txt rename xyz to testc1.txt C:\Users\xxxxxxxx\Desktop\perl\ren_dir>dir ドライブ C のボリューム ラベルは OS です ボリューム シリアル番号は 44FA-B451 です C:\Users\xxxxxxxx\Desktop\perl\ren_dir のディレクトリ 2021/01/12 15:36 <DIR> . 2021/01/12 15:36 <DIR> .. 2021/01/12 15:36 826 ren_dir.pl 2021/01/12 15:25 <DIR> test2.txt 2021/01/12 14:27 <DIR> testb1.txt 2021/01/12 15:25 <DIR> testc1.txt 1 個のファイル 826 バイト 5 個のディレクトリ 163,903,238,144 バイトの空き領域

その他の回答 (3)

  • NuboChan
  • ベストアンサー率47% (745/1583)
回答No.3

OKWAVEで昔々10年以上前に   同じような相談があった。 自前の来歴記事禄を参照して  同記事を検索したが流石に404でした。  しかし参考にしたバッチ処理で実現した記事が   今でも、googleさんで検索するとヒットします。

  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.2

powershellは普段使わないので具体例は出せませんけども、やり方としては >カレントディレクトリのディレクトリのリストを得る >ディレクトリリストの1つごとに >>>当該ディレクトリ内のファイルリストを得る >>>結果をソートする >>>ディレクトリの名前を、一番最初になったファイル名と同じにする >次のディレクトリの処理へループ こんな感じの処理になろうかと思います。 というのも、「フォルダ内の先頭ファイル名」と言っても、普通に「ディレクトリの最初のファイル名」を得ようとすると、必ずしも名前順に並んだ最初のものが得られるわけではないので、一旦ファイル名全部取得して自分で並べなおさなければ「先頭ファイル名」が判明しないからです。 また最初にディレクトリリストを取るのは、ディレクトリをリネーム後に、通常の手続きで「次のディレクトリ」を得ようとすれば、既に処理したディレクトリを得てしまったり、そうすると逆に処理しないディレクトリが出てしまったりする恐れもあるので、きちんと全フォルダ処理するために、念のためやっておいた方が良い気がします。 (まあ、リネームではディレクトリエントリ順は変わらなそうなので、大丈夫かもしれませんが…)

  • Nobu-W
  • ベストアンサー率39% (725/1832)
回答No.1

私の拙い説明より・・・ https://buralog.jp/powershell-folder-rename/ 読んで頂いた方がいいかもですっ 補足なんかもありますしねっ 読んでみて下さい m(_ _)m

関連するQ&A

  • PowerShellでフォルダのアクセス権の取得

    WindowsのPowerShellでフォルダのアクセス権を取得したいです。 以下のコマンドでNTFSのアクセス権、サブディレクトリのNTFSのアクセス権、オーナーが誰か取得する方法は分かりました。 PS > Get-ChildItem 取得したいフォルダ\ -Recurse | Get-ACL | Format-Table -AutoSize -Wrap | Out-File フォルダ名\ファイル名.txt -Encoding Default 本題ですが、NTFSのアクセス権だけでなく、フォルダの共有アクセス権も同時に取得したいのです。それは可能でしょうか? サブディレクトリの共有アクセス権も取得したいです。また、オーナーが誰かも取得したいです。 ご教示頂けますと幸いです。宜しくお願いします。

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

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

  • powershellでフォルダ情報を取得したい

    ■前提・実現したいこと powershellで、カレントフォルダ配下にある多数のフォルダに対し、 フォルダ名、最終更新日時、フォルダ内のjpgファイルの個数、フォルダ内のpngファイルの個数 をカンマ区切りのcsv形式でファイルに保存したいです。 ■試したこと 以下のコマンドで、ファイル名、最終更新日は取得することができました。 Get-ChildItem | Sort-Object Name | Select-Object Name, LastWriteTime | convertTo-csv -delimiter "`t" | Select -Skip 2 | Out-File ../out.txt -encoding Default 1つずつのフォルダに対して以下のコマンドでjpgファイルの個数が取得できるようです。 (Get-ChildItem . | Where-Object { $_.Extension -eq ".jpg" }).Count 最初のコマンドにうまく合わせることで、1コマンドで取得できるようにしたいのですが、 どうすればよいのか分からず、教えていただけないでしょうか。

  • エクセル:マクロを使ったリネーム

    お世話になります。 下記の内容をエクセルのマクロでできるでしょうか? あるフォルダ(ここでは例としてAフォルダとする)のなかに複数のフォルダがはいっています。これらのフォルダ名は実際はかなり長いのですが、必ず5桁の数字+アンダーバーではじまります。 (例:00123_●●●) この各フォルダにはいくつかのファイルが入っていて、拡張子がxmlのファイルが必ず1つ入っています。この拡張子がxmlのファイル名の先頭にフォルダの5桁の数字+アンダーバーをつけた名前にリネームしたいのです。 例:abcde.xml でフォルダ名が00123_●●●の場合  → 00123_abcde.xml にする。 そしてリネームしたxmlファイルをAフォルダ直下に移動させたい。 事情がありリネームソフト等は使えません。 マクロを記述したエクセルファイルをAフォルダ直下に入れて動作させるものとします。 エクセル2003です。 よろしくお願いします。

  • リネームについて

    PHP初心者です。宜しくお願い致します。 リネームについて2点程質問があります。 1.特定フォルダ内にある全てのCSVファイル内の特定箇所の  リネームについて列内に記入されているファイル名「123_4.jpg」  や「123-4.jpg」の「_」を「a」に「-」を「b」にすることは可能  でしょうか?  できれば該当のCSVファイルを開かずに、特定の列を指定しその列に  記入されている全ての「_」と「-」を置換したいと思っています。  「123_4.jpg」→「123a4.jpg」  「123-4.jpg」→「123b4.jpg」   とこのような感じに。 2.特定フォルダ内の画像ファイルのリネーム  上記と同様に「_」を「a」、「-」を「b」置換 できれば、元ファイルをコピーして別のフォルダにリネームした ファイルを保存したいと思っています。 宜しくお願い致します。  

    • ベストアンサー
    • PHP
  • PowerShellでフォルダを削除できない・・・

    [PowerShell]で作成されてから90日以降のフォルダとファイルを削除したいのですが・・・フォルダの削除がうまくいきません・・・ Script Guyを参考に、 $a = Get-ChildItem C:\Scripts foreach($x in $a) { $y = ((Get-Date) - $x.CreationTime).Days if ($y -gt 90 -and $x.PsISContainer -ne $True) {$x.Delete()} } これでC:\Scripts配下のファイルを消すことができることがわかったのですが、C:\Scripts配下のフォルダを削除する方法がわかりません。 なぜこれだとファイルしか消えないのでしょうか? 対象のフォルダにはいっぱいファイル数がありかつファイルサイズもそこそこあります。 PowerShellを動かした時にマシンにかかる負荷を極力抑えたいと思っています。 (なのでループで対象日付のファイルを拾い消し→次にフォルダと考えています。負荷低減になっていますでしょうか?) 詳しい方教えていただけませんでしょうか?

  • 自動でリネームするバチファイルの作り方

    ファイル名の変更を自動で行うバッチファイルを作りたいのでですがどなたかお知恵を貸してください。 ・あるネットワーク上のフォルダには随時ファイルが書き込まれます。 ・そのフォルダを監視し、追加された事を検知するとバッチファイルを自動的に実行します。  (この処理はフリーソフトで実現できるようです) バッチファイルで実現したい事はその追加されたファイルの名前の先頭部分(固定長)を切り取る事です。 ファイル名のフォーマット xxxxxxxxxxxx-yymmdd-hhmmss.txt 上記のファイル名の先頭のxxxの部分をハイフンまで切り取りたいのです。 先頭部分を切り取ってもファイル名が重複する事はありません。 元のファイル名の書式を変更する手段はないので書き込まれた後で変更するしかありません。 つまり、フォルダ上にあるファイルの名前の長さを判定し、規定値を超えていたら切り取り(リネーム)をするという事です。 一度にいくつのファイルが書き込まれるかは分かりませんので該当するファイルがある限り処理をする必要があります。

  • "Folder.jpg" にリネームしようとするとエラーになる

    エクスプローラで "Image.jpg" を "Folder.jpg" にリネームしようとすると、 Image.jpg の名前を変更できません。指定されたファイル名は既に存在します。別の名前を指定してください。 というエラーが表示されます。 "Folder.jpg" というファイルは存在しないのですが、なぜでしょう?

  • VBScriptでフォルダ内の全ファイル名取得

    こんにちは VBScriptでツールを作成しています。 フォルダA内の全ファイルをリネームして 別フォルダB内に同じファイル名があればリネームして フォルダA内のファイルをコピーしたいのですが 一度にフォルダ内の全ファイル名を取得する方法が分かりません。 なにかいい方法は無いでしょうか?よろしくお願いします。

  • 一括で上書きリネームしたい

    WindowsXP環境です。 例えば、ファイル名 「a.txt」 と 「a (競合コピー).txt」 というファイルが同じフォルダー内にあります。 「a.txt」が古いファイルで「a (競合コピー).txt」が新しいファイルです。 (競合コピー)とファイル名に付いた新しいファイルがいろんなフォルダー内にいくつもあります。 新しいファイルである「a (競合コピー).txt」を「a.txt」にリネームするフリーのソフトがありませんか? 元々ある「a.txt」の方は削除されてもリネームされても構いません。 リネーム後のファイル名が同じフォルダーに無ければリネームできるソフトは見つかるのですが、そうでない場合だと見つかりませんでした。 何かいい方法あったら教えてください。 なぜ、こうなったかというとDropboxで久しぶりにインストールし直して同期したら、Dropboxのサーバーにあった古いファイルがローカルのフォルダーに保存され、元々あった新しいファイルが(競合コピー)と付け加えられてしまいました。逆ならよかったのですが。。。 何かいいソフトか方法があれば教えてください。よろしくお願いします。

専門家に質問してみよう