質問編集履歴

5

PHPによる解決方法も書いておきます。

2018/03/03 14:48

投稿

Yashichi
Yashichi

スコア35

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

不要な情報の削除

2018/03/03 14:48

投稿

Yashichi
Yashichi

スコア35

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

ソースコードの修正、新たな問題点の追加、タイトルの変更

2018/03/03 11:09

投稿

Yashichi
Yashichi

スコア35

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

コードを修正しました

2018/03/03 07:23

投稿

Yashichi
Yashichi

スコア35

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,20 @@
1
1
  ###追記
2
2
 
3
+ 下記コードが現在最新です。
4
+
5
+
6
+
3
- renameの第一引数を$fileから$pathに変ところ、
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, "2017年8月.doc");
63
+ rename($path, $new__path);
54
64
 
55
65
  }
56
66
 

1

試したことを追記しました

2017/09/03 15:21

投稿

Yashichi
Yashichi

スコア35

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で書いています。