移动并替换所有子目录中具有特定分辨率的每个图像

时间:2019-02-25 14:13:30

标签: php linux bash

我需要每天执行一次cron作业,以移动宽度或高度超过1000像素的所有图像,然后将移动的图像替换为默认图像,该图像位于运行此脚本的同一目录中。

/gwart.co.uk/mediawiki/images/too_large.jpg //file used to replace old image

我能够使用以下方法过滤所有图像:

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; | awk -F ',' '$2 > 1000 || $3 > 1000'

将会输出

./b1/Eldar_Guardian.png, 892, 1767
./b2/Farseer_with_Guardians1.png, 894, 1308

正在显示文件,但事实并非没有删除awk,我不确定如何实际移动这些图像,然后将原始文件名存储到{{1 }}

我的目标是为此使用Bash,但是如果有人愿意,也许cp也是一种选择。

另一个烦人的要求是原始文件类型需要保留,而且还存在相关的too_large.jpg文件。

  • 移动高度或宽度超过1000像素(以匹配为准)的图像。
  • cp too_large [.jpg / .png / .jpg]移至图像位置

3 个答案:

答案 0 :(得分:2)

假设您有详细信息,那么类似的东西-

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; |
  awk -F ',' '$2 > 1000 || $3 > 1000 {print $1}' |
  while read -r file
  do mv "$file" "some/other/place/$newName"
     cp /gwart.co.uk/mediawiki/images/too_large.jpg "$file"
  done

原始find返回文件名和水平和垂直像素计数。

./b1/Eldar_Guardian.png, 892, 1767
./b2/Farseer_with_Guardians1.png, 894, 1308

您的awk已经在选择超大文件;我只是添加了一个步骤,仅在找到文件名时才打印文件名。

  awk -F ',' '$2 > 1000 || $3 > 1000 {print $1}' | # print of X or Y >1k

因此循环仅需读取和处理文件名。

答案 1 :(得分:1)

如果要使用PHP进行此伪代码,则应进行较小的调整。您将要确保您位于正确的目录(chdir)中,因为该示例假定您要检查的文件位于运行PHP的目录中。

$imagelist = glob('*.{png,jpg,jpeg}',GLOB_BRACE);
foreach ($imagelist as $image) {

    $image_info = getimagesize($image);
    if ($image_info[0] > 1000 OR
        $image_info[1] > 1000) {

        rename($image,'movebigfilelocation');
        copy('/gwart.co.uk/mediawiki/images/too_large.jpg',$image);

    }
}

答案 2 :(得分:1)

如果您具有PHP和Imagick,则还可以缩小图像尺寸。片段:

$maxXres = 1000;

$mimg = new \Imagick($img['tmp_name']);
$xresolution = $mimg->getImageWidth();

if ($xresolution > $this->maxXres){
   $mimg->thumbnailImage($this->maxXres, 0);
}

$fn = "/where/ever/downscaled.jpg";
$mimg->writeImage($fn);

然后用$ fn覆盖原始文件。该示例仅考虑x轴,但是如何检查y侧是相同的,只是使用getImageHeight代替。