Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按文件大小匹配文件并相应重命名?_Php_Bash_Shell_Comparison_Rename - Fatal编程技术网

Php 如何按文件大小匹配文件并相应重命名?

Php 如何按文件大小匹配文件并相应重命名?,php,bash,shell,comparison,rename,Php,Bash,Shell,Comparison,Rename,我有两个名称不匹配的图像目录,但大部分是匹配的图像 Dir 1 Size | Dir 2 Size --------------------------------------------------- img1.jpg 508960 | a_image_name.jpg 1038644 img2.jpg 811430 | another_image_name.jpg 396240 ... ... |

我有两个名称不匹配的图像目录,但大部分是匹配的图像

Dir 1       Size   | Dir 2                  Size
---------------------------------------------------
img1.jpg    508960 | a_image_name.jpg       1038644
img2.jpg    811430 | another_image_name.jpg 396240
...         ...    | ...                    ...
img1000.jpg 602583 | image_name.jpg         811430
...         ...    | 
img2000.jpg 396240 | 
第一个目录有更多图像,但名称错误。第二个目录的名称正确,但顺序与第一个目录不对应

我想通过比较文件大小(或其他方式)和目录2来重命名目录1中的文件。在上面的示例中,img2.jpg将重命名为image_name.jpg,因为两者具有相同的文件大小

你能给我指一下正确的方向吗


最好是通过应用程序(Mac)、shell或php。

也许更明智的做法是使用文件哈希而不是使用文件大小

简而言之:使用glob(),获取dir1中的文件列表,迭代,创建md5哈希(md5()+file_get_contents()),存储在数组中,使用哈希作为键,文件名作为值。 对dir2做同样的操作

如果array2重命名文件中存在具有相同哈希的条目,则迭代array1

代码如下:(未测试,未优化)


也许更明智的做法是使用文件的哈希值,而不是使用文件大小

简而言之:使用glob(),获取dir1中的文件列表,迭代,创建md5哈希(md5()+file_get_contents()),存储在数组中,使用哈希作为键,文件名作为值。 对dir2做同样的操作

如果array2重命名文件中存在具有相同哈希的条目,则迭代array1

代码如下:(未测试,未优化)


这是我的解决方案,它根据文件大小重命名dir1中的文件

第1部分的内容:

-rw-r--r--  1 haiv  staff   10 Aug 16 13:18 file1.txt
-rw-r--r--  1 haiv  staff   20 Aug 16 13:18 file2.txt
-rw-r--r--  1 haiv  staff   30 Aug 16 13:18 file3.txt
-rw-r--r--  1 haiv  staff  205 Aug 16 13:18 file4.txt
(注意,第五列存储文件大小。)和dir2的内容:

-rw-r--r--  1 haiv  staff   30 Aug 16 13:18 doc.txt
-rw-r--r--  1 haiv  staff  205 Aug 16 13:18 dopey.txt
-rw-r--r--  1 haiv  staff   20 Aug 16 13:18 grumpy.txt
-rw-r--r--  1 haiv  staff   10 Aug 16 13:18 happy.txt
创建文件调用~/rename.awk(是的,从主目录创建,以避免污染dir1或dir2):

现在,将cd放入dir1(如果要重命名dir1中的文件),并发出以下命令:

$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l)
对结果满意后,通过管道将上述命令传递给sh以执行更改:

$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l) | sh

$awk-f~/rename.awk这是我的解决方案,它根据文件大小在dir1中重命名文件

第1部分的内容:

-rw-r--r--  1 haiv  staff   10 Aug 16 13:18 file1.txt
-rw-r--r--  1 haiv  staff   20 Aug 16 13:18 file2.txt
-rw-r--r--  1 haiv  staff   30 Aug 16 13:18 file3.txt
-rw-r--r--  1 haiv  staff  205 Aug 16 13:18 file4.txt
(注意,第五列存储文件大小。)和dir2的内容:

-rw-r--r--  1 haiv  staff   30 Aug 16 13:18 doc.txt
-rw-r--r--  1 haiv  staff  205 Aug 16 13:18 dopey.txt
-rw-r--r--  1 haiv  staff   20 Aug 16 13:18 grumpy.txt
-rw-r--r--  1 haiv  staff   10 Aug 16 13:18 happy.txt
创建文件调用~/rename.awk(是的,从主目录创建,以避免污染dir1或dir2):

现在,将cd放入dir1(如果要重命名dir1中的文件),并发出以下命令:

$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l)
对结果满意后,通过管道将上述命令传递给sh以执行更改:

$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l) | sh

$awk-f~/rename.awk这是一个很好的答案,但是,您可以使用md5_file($file)而不是md5(file_get_contents($file)),我假设它存在,但老实说,我懒得看手册;)顺便说一句,当然没有必要构建2个阵列。这是一个很好的答案,但是,您可以只使用md5_file($file)而不是md5(file_get_contents($file))。我认为这是存在的,但老实说,我懒得看手册;)顺便说一句,当然没有必要构建2个阵列