![将系统上的所有图像复制到一个文件夹](https://linux22.com/image/883710/%E5%B0%86%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84%E6%89%80%E6%9C%89%E5%9B%BE%E5%83%8F%E5%A4%8D%E5%88%B6%E5%88%B0%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我正在尝试创建一个 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
要查找主目录中所有带有jpg
、jpeg
、png
或gif
扩展名的文件并将其复制到~/backup
,请尝试:
cd
find . -regex '.*\(jpg\|jpeg\|png\|gif\)' \! -path './backup/*' -exec echo cp -t backup {} +
怎么运行的
cd
这使得主目录
~/
与当前目录相同./
。find .
在当前目录中查找文件
-regex '.*\(jpg\|jpeg\|png\|gif\)'
将结果限制为名称以
jpg
、jpeg
、png
或结尾的文件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 设计的这篇文章。