質問編集履歴
5
PHPによる解決方法も書いておきます。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,91 @@
|
|
1
|
+
#PHPでの解決方法
|
2
|
+
|
3
|
+
```PHP
|
4
|
+
|
5
|
+
<?php
|
6
|
+
|
7
|
+
// 再帰的にファイルを取得(サブディレクトリ内のファイルも取得する)
|
8
|
+
|
9
|
+
function getFiles($path) {
|
10
|
+
|
11
|
+
$result = array();
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
foreach(glob($path . "/*") as $file) {
|
16
|
+
|
17
|
+
if(strpos($file, "2018-02") !== false) {
|
18
|
+
|
19
|
+
$newname = str_replace("2018-02", "2018-03", $file);
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
if(!file_exists($file) && !is_writable($file)) {
|
24
|
+
|
25
|
+
// そもそも対象のファイルが存在しているか・書き込みが可能なのか
|
26
|
+
|
27
|
+
echo "Error: You cannot write to $file", PHP_EOL;
|
28
|
+
|
29
|
+
exit(255);
|
30
|
+
|
31
|
+
} elseif(!is_writable(dirname($file))) {
|
32
|
+
|
33
|
+
// ディレクトリの書き込み権限を調べる
|
34
|
+
|
35
|
+
echo "Error: You cannot write to $file because you don't have write permission of directory", PHP_EOL;
|
36
|
+
|
37
|
+
exit(255);
|
38
|
+
|
39
|
+
}
|
40
|
+
|
41
|
+
rename($file, $newname);
|
42
|
+
|
43
|
+
chmod($newname, 0777);
|
44
|
+
|
45
|
+
$file = $newname;
|
46
|
+
|
47
|
+
}
|
48
|
+
|
49
|
+
if(is_dir($file)) {
|
50
|
+
|
51
|
+
$result = array_merge($result, getFiles($file));
|
52
|
+
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
$result[] = basename($file);
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
return $result;
|
64
|
+
|
65
|
+
}
|
66
|
+
|
67
|
+
$path = dirname(__FILE__);
|
68
|
+
|
69
|
+
getFiles($path);
|
70
|
+
|
71
|
+
```
|
72
|
+
|
73
|
+
###このコードの問題点
|
74
|
+
|
75
|
+
このコードをターミナルから実行する場合、ディレクトリに書き込み権限が無いと動きません。
|
76
|
+
|
77
|
+
特に今回解決できてない点として、仮想マシンで動かしてるLinuxとWindowsとの共有フォルダ
|
78
|
+
|
79
|
+
上のディレクトリ内のファイルを変更する場合、Linux側からディレクトリの権限を変更するにはどうすれば良いか分からなかったので、
|
80
|
+
|
81
|
+
共有フォルダ外からしかこのPHPファイルは実行できません。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
なので、この質問に関して選ばせていただいたベストアンサーによる方法を取っていただくのが確実です。(動作検証済み)
|
86
|
+
|
87
|
+
|
88
|
+
|
1
89
|
#現状
|
2
90
|
|
3
91
|
PHPを使用して、特定のディレクトリ内に含まれる特定の文字列を含むファイルの名前を一括で変換するというコードを書きました。
|
4
不要な情報の削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -143,245 +143,3 @@
|
|
143
143
|
CentOS 6.9
|
144
144
|
|
145
145
|
Windows10
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
##過去の経緯(ここからは過去の投稿です)
|
152
|
-
|
153
|
-
下記に書かれてある文章はそもそもディレクトリ内のファイル名を再帰的に変更しようとしてできなかったものです。
|
154
|
-
|
155
|
-
###追記
|
156
|
-
|
157
|
-
下記コードが現在最新です。
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
renameの第一引数をカレントディレクトリが入っている変数に変更しました。
|
162
|
-
|
163
|
-
特に気になるのは、rename自体はできたのですが、
|
164
|
-
|
165
|
-
各ディレクトリに入っていたファイルが全て消えた後に、
|
166
|
-
|
167
|
-
PHPファイルがあるディレクトリ内に、1ファイルのみrename後の形で現れたということです。
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
```PHP
|
174
|
-
|
175
|
-
<?php
|
176
|
-
|
177
|
-
// ディレクトリのパス
|
178
|
-
|
179
|
-
$dir = "/var/www/html/テスト/" ;
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
$check_dirs = [ $dir ] ;
|
184
|
-
|
185
|
-
$file_paths = [] ;
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
while( $check_dirs ) {
|
190
|
-
|
191
|
-
$dir_path = $check_dirs[0] ;
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if( is_dir ( $dir_path ) && $handle = opendir ( $dir_path ) ) {
|
196
|
-
|
197
|
-
while( ( $file = readdir ( $handle ) ) !== false ) {
|
198
|
-
|
199
|
-
if( in_array ( $file, [ ".", ".." ] ) !== false ) continue ;
|
200
|
-
|
201
|
-
$path = rtrim ( $dir_path, "/" ) . "/" . $file ;
|
202
|
-
|
203
|
-
$new__path = $dir_path . "2017年" . ".doc";
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
if ( filetype ( $path ) === "dir" ) {
|
208
|
-
|
209
|
-
$check_dirs[] = $path ;
|
210
|
-
|
211
|
-
} else {
|
212
|
-
|
213
|
-
// $file: ファイル名
|
214
|
-
|
215
|
-
// $path: ファイルのパス
|
216
|
-
|
217
|
-
rename($path, $new__path);
|
218
|
-
|
219
|
-
}
|
220
|
-
|
221
|
-
}
|
222
|
-
|
223
|
-
}
|
224
|
-
|
225
|
-
array_shift( $check_dirs ) ;
|
226
|
-
|
227
|
-
}
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
```
|
232
|
-
|
233
|
-
---
|
234
|
-
|
235
|
-
**質問ここから**
|
236
|
-
|
237
|
-
###前提・実現したいこと
|
238
|
-
|
239
|
-
ディレクトリ内にあるファイルを、全て同じファイル名に変更する処理をphpで書いています。
|
240
|
-
|
241
|
-
それを、Linux上で実行しようとしています。
|
242
|
-
|
243
|
-
どうしたら、全てのファイル名を変更できるのでしょうか...?
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
ディレクトリ構造(/var/www/html/テスト/)
|
248
|
-
|
249
|
-
```
|
250
|
-
|
251
|
-
test.php(処理を書いてるファイル)
|
252
|
-
|
253
|
-
test
|
254
|
-
|
255
|
-
┗ test1
|
256
|
-
|
257
|
-
┗ たけし.docx
|
258
|
-
|
259
|
-
┗ 健康
|
260
|
-
|
261
|
-
┗ たけし.docx
|
262
|
-
|
263
|
-
┗ たけし - コピー -.docx
|
264
|
-
|
265
|
-
┗ 行幸
|
266
|
-
|
267
|
-
┗ たけし.docx
|
268
|
-
|
269
|
-
┗ 釣行
|
270
|
-
|
271
|
-
┗ たけし.docx
|
272
|
-
|
273
|
-
┗ たけし(2).docx
|
274
|
-
|
275
|
-
┗ 富む
|
276
|
-
|
277
|
-
┗ たけし.docx
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
```
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
###発生している問題・エラーメッセージ
|
286
|
-
|
287
|
-
以下は、test.phpを実行後に出たエラーメッセージです。
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
このメッセージを見る限り、ファイルを再帰的に取得することはできているようです。
|
292
|
-
|
293
|
-
ですが、それをrenameする段階で失敗しているようです。なぜ。
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
```
|
298
|
-
|
299
|
-
[root@localhost テスト]# php -f test.php
|
300
|
-
|
301
|
-
PHP Warning: rename(たけし.docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
302
|
-
|
303
|
-
PHP Warning: rename(たけし - コピー.docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
304
|
-
|
305
|
-
PHP Warning: rename(たけし.docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
306
|
-
|
307
|
-
PHP Warning: rename(たけし.docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
308
|
-
|
309
|
-
PHP Warning: rename(たけし.docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
310
|
-
|
311
|
-
PHP Warning: rename(たけし (2).docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
312
|
-
|
313
|
-
PHP Warning: rename(たけし.docx,2017年8月.doc): No such file or directory in /var/www/html/テスト/test.php on line 22
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
```
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
###該当のソースコード
|
322
|
-
|
323
|
-
```PHP
|
324
|
-
|
325
|
-
<?php
|
326
|
-
|
327
|
-
// ディレクトリのパス
|
328
|
-
|
329
|
-
$dir = "/var/www/html/テスト/" ;
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
$check_dirs = [ $dir ] ;
|
334
|
-
|
335
|
-
$file_paths = [] ;
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
while( $check_dirs ) {
|
340
|
-
|
341
|
-
$dir_path = $check_dirs[0] ;
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
if( is_dir ( $dir_path ) && $handle = opendir ( $dir_path ) ) {
|
346
|
-
|
347
|
-
while( ( $file = readdir ( $handle ) ) !== false ) {
|
348
|
-
|
349
|
-
if( in_array ( $file, [ ".", ".." ] ) !== false ) continue ;
|
350
|
-
|
351
|
-
$path = rtrim ( $dir_path, "/" ) . "/" . $file ;
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
if ( filetype ( $path ) === "dir" ) {
|
356
|
-
|
357
|
-
$check_dirs[] = $path ;
|
358
|
-
|
359
|
-
} else {
|
360
|
-
|
361
|
-
// $file: ファイル名
|
362
|
-
|
363
|
-
// $path: ファイルのパス
|
364
|
-
|
365
|
-
rename($file, "2017年8月.doc");
|
366
|
-
|
367
|
-
}
|
368
|
-
|
369
|
-
}
|
370
|
-
|
371
|
-
}
|
372
|
-
|
373
|
-
array_shift( $check_dirs ) ;
|
374
|
-
|
375
|
-
}
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
```
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
###補足情報(言語/FW/ツール等のバージョンなど)
|
384
|
-
|
385
|
-
PHP 5.6.31
|
386
|
-
|
387
|
-
CentOS 6.9
|
3
ソースコードの修正、新たな問題点の追加、タイトルの変更
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ディレクトリ内のファイル名を再帰的に変更したい
|
1
|
+
ディレクトリ内のファイル名を再帰的に変更したけれど、反映されていない
|
test
CHANGED
@@ -1,3 +1,157 @@
|
|
1
|
+
#現状
|
2
|
+
|
3
|
+
PHPを使用して、特定のディレクトリ内に含まれる特定の文字列を含むファイルの名前を一括で変換するというコードを書きました。
|
4
|
+
|
5
|
+
**特定のディレクトリとは、今回はコードを書いたphpファイルが置いてあるディレクトリになります。**
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
```PHP
|
10
|
+
|
11
|
+
<?php
|
12
|
+
|
13
|
+
// 再帰的にファイルを取得(サブディレクトリ内のファイルも取得する)
|
14
|
+
|
15
|
+
function getFiles($path) {
|
16
|
+
|
17
|
+
$result = array();
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
foreach(glob($path . "/*") as $file) {
|
22
|
+
|
23
|
+
if(strpos($file, "2018-02") !== false) {
|
24
|
+
|
25
|
+
$file = str_replace("2018-02", "2018-03", $file);
|
26
|
+
|
27
|
+
}
|
28
|
+
|
29
|
+
if(is_dir($file)) {
|
30
|
+
|
31
|
+
$result = array_merge($result, getFiles($file));
|
32
|
+
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
$result[] = basename($file);
|
38
|
+
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
return $result;
|
44
|
+
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
$path = dirname(__FILE__);
|
50
|
+
|
51
|
+
print_r(getFiles($path));
|
52
|
+
|
53
|
+
```
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
上記のPHPファイルをLinux上で実行してみると、下記のような結果を得られます。
|
58
|
+
|
59
|
+
```
|
60
|
+
|
61
|
+
[yashichi@localhost responsive_test]$ php index.php
|
62
|
+
|
63
|
+
Array
|
64
|
+
|
65
|
+
(
|
66
|
+
|
67
|
+
[0] => font-awesome.css
|
68
|
+
|
69
|
+
[1] => font-awesome.min.css
|
70
|
+
|
71
|
+
[2] => css
|
72
|
+
|
73
|
+
[3] => fileNameChange.js
|
74
|
+
|
75
|
+
[4] => FontAwesome.otf
|
76
|
+
|
77
|
+
[5] => fontawesome-webfont.eot
|
78
|
+
|
79
|
+
[6] => fontawesome-webfont.svg
|
80
|
+
|
81
|
+
[7] => fontawesome-webfont.ttf
|
82
|
+
|
83
|
+
[8] => fontawesome-webfont.woff
|
84
|
+
|
85
|
+
[9] => fontawesome-webfont.woff2
|
86
|
+
|
87
|
+
[10] => fonts
|
88
|
+
|
89
|
+
[11] => KAZTDSCF2550_TP_V.jpg
|
90
|
+
|
91
|
+
[12] => images
|
92
|
+
|
93
|
+
[13] => index.html
|
94
|
+
|
95
|
+
[14] => index.php
|
96
|
+
|
97
|
+
[15] => 2018-03.txt
|
98
|
+
|
99
|
+
[16] => test1
|
100
|
+
|
101
|
+
[17] => 2018-03.txt
|
102
|
+
|
103
|
+
[18] => test2
|
104
|
+
|
105
|
+
[19] => 2018-03.txt
|
106
|
+
|
107
|
+
[20] => test3
|
108
|
+
|
109
|
+
[21] => test
|
110
|
+
|
111
|
+
)
|
112
|
+
|
113
|
+
```
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
ファイル名に2018-02が含まれるもののファイル名を2018-03に書き換えるというもので、
|
118
|
+
|
119
|
+
ターミナル上の結果を見る限りは成功しているように見えます。
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
#解決できないこと
|
124
|
+
|
125
|
+
ターミナル上に表示される実行結果ではファイル名の置換に成功しているのですが、
|
126
|
+
|
127
|
+
実際にWindows上のエクスプローラーで該当のファイルを見ても、変化していません。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
これは何が原因なのでしょうか...?
|
132
|
+
|
133
|
+
全く検討がつきません。
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
###補足情報(言語/FW/ツール等のバージョンなど)
|
140
|
+
|
141
|
+
PHP 7.1.4
|
142
|
+
|
143
|
+
CentOS 6.9
|
144
|
+
|
145
|
+
Windows10
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
##過去の経緯(ここからは過去の投稿です)
|
152
|
+
|
153
|
+
下記に書かれてある文章はそもそもディレクトリ内のファイル名を再帰的に変更しようとしてできなかったものです。
|
154
|
+
|
1
155
|
###追記
|
2
156
|
|
3
157
|
下記コードが現在最新です。
|
2
コードを修正しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
###追記
|
2
2
|
|
3
|
+
下記コードが現在最新です。
|
4
|
+
|
5
|
+
|
6
|
+
|
3
|
-
renameの第一引数を
|
7
|
+
renameの第一引数をカレントディレクトリが入っている変数に変更しました。
|
8
|
+
|
4
|
-
|
9
|
+
特に気になるのは、rename自体はできたのですが、
|
10
|
+
|
5
|
-
ファイルが全
|
11
|
+
各ディレクトリに入っていたファイルが全て消えた後に、
|
6
|
-
|
7
|
-
|
8
|
-
|
12
|
+
|
9
|
-
rename
|
13
|
+
PHPファイルがあるディレクトリ内に、1ファイルのみrename後の形で現れたということです。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
10
18
|
|
11
19
|
```PHP
|
12
20
|
|
@@ -38,6 +46,8 @@
|
|
38
46
|
|
39
47
|
$path = rtrim ( $dir_path, "/" ) . "/" . $file ;
|
40
48
|
|
49
|
+
$new__path = $dir_path . "2017年" . ".doc";
|
50
|
+
|
41
51
|
|
42
52
|
|
43
53
|
if ( filetype ( $path ) === "dir" ) {
|
@@ -50,7 +60,7 @@
|
|
50
60
|
|
51
61
|
// $path: ファイルのパス
|
52
62
|
|
53
|
-
rename($path,
|
63
|
+
rename($path, $new__path);
|
54
64
|
|
55
65
|
}
|
56
66
|
|
1
試したことを追記しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,75 @@
|
|
1
|
+
###追記
|
2
|
+
|
3
|
+
renameの第一引数を$fileから$pathに変えたところ、
|
4
|
+
|
5
|
+
ファイルが全部消えてしまいました。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
renameによってファイルが消えたのか、それとも別のところに原因があるのか分かりません...。
|
10
|
+
|
11
|
+
```PHP
|
12
|
+
|
13
|
+
<?php
|
14
|
+
|
15
|
+
// ディレクトリのパス
|
16
|
+
|
17
|
+
$dir = "/var/www/html/テスト/" ;
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
$check_dirs = [ $dir ] ;
|
22
|
+
|
23
|
+
$file_paths = [] ;
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
while( $check_dirs ) {
|
28
|
+
|
29
|
+
$dir_path = $check_dirs[0] ;
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
if( is_dir ( $dir_path ) && $handle = opendir ( $dir_path ) ) {
|
34
|
+
|
35
|
+
while( ( $file = readdir ( $handle ) ) !== false ) {
|
36
|
+
|
37
|
+
if( in_array ( $file, [ ".", ".." ] ) !== false ) continue ;
|
38
|
+
|
39
|
+
$path = rtrim ( $dir_path, "/" ) . "/" . $file ;
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
if ( filetype ( $path ) === "dir" ) {
|
44
|
+
|
45
|
+
$check_dirs[] = $path ;
|
46
|
+
|
47
|
+
} else {
|
48
|
+
|
49
|
+
// $file: ファイル名
|
50
|
+
|
51
|
+
// $path: ファイルのパス
|
52
|
+
|
53
|
+
rename($path, "2017年8月.doc");
|
54
|
+
|
55
|
+
}
|
56
|
+
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
array_shift( $check_dirs ) ;
|
62
|
+
|
63
|
+
}
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
```
|
68
|
+
|
69
|
+
---
|
70
|
+
|
71
|
+
**質問ここから**
|
72
|
+
|
1
73
|
###前提・実現したいこと
|
2
74
|
|
3
75
|
ディレクトリ内にあるファイルを、全て同じファイル名に変更する処理をphpで書いています。
|