将系统上的所有图像复制到一个文件夹

将系统上的所有图像复制到一个文件夹

我正在尝试创建一个 bash 脚本,它将在系统中搜索图像jpg, jpeg, png, gif并将它们复制到新位置。但我很难弄清楚如何做到这一点。

这是我目前所拥有的

#!/bin/bash
STRING="Copy system images \n"
echo $STRING

# settings
$LOCATION = ~/backup/images/$(date)
$FILETYPE = jpg, jpeg, png, gif

# in PHP
# preg_replace("/[^, ]+/", "*.$0", $input_lines);
# bash?? filetype should be *.jpg, *.jpeg, *.png, *.png

# find all images defined in FILETYPE
find ~/ -type f -iname $FILETYPE > images.txt 
&& echo "Number of images loccated: " 
&& wc -l images.txt

# read every line (image path), and copy to new location.
&& while read line; do cp $line ~/backup/$line; done < images.txt
&& rm images.txt

我知道,这可能有点过头了。但是,自动化脚本就很棒了!

正如您所看到的,我不知道如何使用 sed、preg_replace $FILETYPE。而且过度使用&&似乎不对?

答案1

要查找主目录中所有带有jpgjpegpnggif扩展名的文件并将其复制到~/backup,请尝试:

cd
find . -regex '.*\(jpg\|jpeg\|png\|gif\)' \! -path './backup/*' -exec echo cp -t backup {} +

怎么运行的

  • cd

    这使得主目录~/与当前目录相同./

  • find .

    在当前目录中查找文件

  • -regex '.*\(jpg\|jpeg\|png\|gif\)'

    将结果限制为名称以jpgjpegpng或结尾的文件gif

  • \! -path './backup/*'

    忽略备份目录中已存在的文件。

    请注意,虽然-regex期望正则表达式作为其参数, -path期望一个全局。这是两种截然不同的形式,遵循着截然不同的规则。

  • -exec echo cp -t backup {} +

    将找到的文件移动到备份目录。

答案2

这是另一个非常有效的方法。它添加了 EPOCH 时间以防止覆盖同名文件。

cd /media/myhome/'Local station'/
find . -path ./jpg -prune -o -type f -iname '*.jpg' -exec sh -c '
for file do
   newname="${file##*/}"
   newname="${newname%.jpg}"
   mv -T -- "$file" "/media/myhome/Local station/jpg/$newname-$(date +%s).jpg"
done
' find-sh {} +
cd  ~/

它是由 Kamil 设计的这篇文章

相关内容