質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

479閲覧

ディレクトリ内のファイル名を再帰的に変更したけれど、反映されていない

Yashichi

総合スコア35

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/09/03 14:13

編集2018/03/03 14:48

#PHPでの解決方法

PHP

1<?php 2// 再帰的にファイルを取得(サブディレクトリ内のファイルも取得する) 3function getFiles($path) { 4 $result = array(); 5 6 foreach(glob($path . "/*") as $file) { 7 if(strpos($file, "2018-02") !== false) { 8 $newname = str_replace("2018-02", "2018-03", $file); 9 10 if(!file_exists($file) && !is_writable($file)) { 11 // そもそも対象のファイルが存在しているか・書き込みが可能なのか 12 echo "Error: You cannot write to $file", PHP_EOL; 13 exit(255); 14 } elseif(!is_writable(dirname($file))) { 15 // ディレクトリの書き込み権限を調べる 16 echo "Error: You cannot write to $file because you don't have write permission of directory", PHP_EOL; 17 exit(255); 18 } 19 rename($file, $newname); 20 chmod($newname, 0777); 21 $file = $newname; 22 } 23 if(is_dir($file)) { 24 $result = array_merge($result, getFiles($file)); 25 } 26 27 $result[] = basename($file); 28 } 29 30 return $result; 31} 32$path = dirname(__FILE__); 33getFiles($path);

###このコードの問題点
このコードをターミナルから実行する場合、ディレクトリに書き込み権限が無いと動きません。
特に今回解決できてない点として、仮想マシンで動かしてるLinuxとWindowsとの共有フォルダ
上のディレクトリ内のファイルを変更する場合、Linux側からディレクトリの権限を変更するにはどうすれば良いか分からなかったので、
共有フォルダ外からしかこのPHPファイルは実行できません。

なので、この質問に関して選ばせていただいたベストアンサーによる方法を取っていただくのが確実です。(動作検証済み)

#現状
PHPを使用して、特定のディレクトリ内に含まれる特定の文字列を含むファイルの名前を一括で変換するというコードを書きました。
特定のディレクトリとは、今回はコードを書いたphpファイルが置いてあるディレクトリになります。

PHP

1<?php 2// 再帰的にファイルを取得(サブディレクトリ内のファイルも取得する) 3function getFiles($path) { 4 $result = array(); 5 6 foreach(glob($path . "/*") as $file) { 7 if(strpos($file, "2018-02") !== false) { 8 $file = str_replace("2018-02", "2018-03", $file); 9 } 10 if(is_dir($file)) { 11 $result = array_merge($result, getFiles($file)); 12 } 13 14 $result[] = basename($file); 15 } 16 17 return $result; 18} 19 20$path = dirname(__FILE__); 21print_r(getFiles($path));

上記のPHPファイルをLinux上で実行してみると、下記のような結果を得られます。

[yashichi@localhost responsive_test]$ php index.php Array ( [0] => font-awesome.css [1] => font-awesome.min.css [2] => css [3] => fileNameChange.js [4] => FontAwesome.otf [5] => fontawesome-webfont.eot [6] => fontawesome-webfont.svg [7] => fontawesome-webfont.ttf [8] => fontawesome-webfont.woff [9] => fontawesome-webfont.woff2 [10] => fonts [11] => KAZTDSCF2550_TP_V.jpg [12] => images [13] => index.html [14] => index.php [15] => 2018-03.txt [16] => test1 [17] => 2018-03.txt [18] => test2 [19] => 2018-03.txt [20] => test3 [21] => test )

ファイル名に2018-02が含まれるもののファイル名を2018-03に書き換えるというもので、
ターミナル上の結果を見る限りは成功しているように見えます。

#解決できないこと
ターミナル上に表示される実行結果ではファイル名の置換に成功しているのですが、
実際にWindows上のエクスプローラーで該当のファイルを見ても、変化していません。

これは何が原因なのでしょうか...?
全く検討がつきません。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 7.1.4
CentOS 6.9
Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PHPなど不要。そう、シェル芸ならね!

bash

1$ find . -type f -name '*2018-02*'|awk '$0="mv "$0" "gensub("2018-02","2018-03","g")'|sh

投稿2018/03/03 14:01

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yashichi

2018/03/03 14:39

ワンライナーでできるのすごい...!ありがとうございます、できました!
guest

0

rename($file, "2017年8月.doc");rename($path, "2017年8月.doc"); にすればよいのではないですか。rename() の第一引数が絶対パスでない場合は、カレントディレクトリからの相対パスでの
指定になりますから。

投稿2017/09/03 14:21

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yashichi

2017/09/03 14:24

なぜかファイルが全部消えてしまいました...どうやら全ファイルに処理は行き渡ったみたいなんですが、それによってファイルが消えたようです...
unau

2017/09/03 14:27

rename($path, "2017年8月.doc"); だと、全部、同じファイル名に書き変えてしまいますね。それで消えたということでしょうか。
Yashichi

2017/09/03 14:31

このコードでは、それぞれ取得してきたファイルに対してrenameをかけているというわけではないということなのでしょうか?
unau

2017/09/03 15:00

「rename($file, "2017年8月.doc"); を rename($path, "2017年8月.doc"); にすればよいのではないですか。」と書いたのは軽率でした。「rename($file, "2017年8月.doc"); で $file が見つからないのは、カレントディレクトリを探しているからであって、そこは $path でなければなりません」とすべきでした。 rename($file, $new_path) とすべきで、$new_path のほうは、$dir_paht . "/2017年8月.doc" とでもする感じでしょうか。 消えてしまったファイルは、おそらくカレントディレクトリにあります。
unau

2017/09/03 15:01

でもカレントディレクトリに残っているのは最後のひとつだけですが。
Yashichi

2017/09/03 15:15

カレントディレクトリに一ファイルのみrename後のファイルが生成されてます...。 これはそもそもrenameを使う事自体が間違えという可能性があるということですかね...
unau

2017/09/03 15:18

間違っていないと思いますが、最近の PHP にもっと便利な関数があるかどうかは、めっきり PHP に触ることがなくなってしまった私にはわかりません。
Yashichi

2017/09/03 15:22

承知しました...!ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問