使用 find 来移动所有图像(名称中有大小的图像除外)的 Shell 脚本?

使用 find 来移动所有图像(名称中有大小的图像除外)的 Shell 脚本?

我有一个 WordPress 网站的服务器备份,该网站的上传目录中有大约 1000 张图片。当通过 WordPress 上传图片时,它会创建多种尺寸的图片,例如:

foobar.jpg
foobar-170x170.jpg
foobar-250x250.jpg

我熟悉使用 来find移动目录及其子文件夹中的所有文件,find . -mindepth 3 -type f -print -exec mv {jpe?g|png|gif} . \;但我很好奇是否可以添加类似“不要移动这个”的排除。我想给出一个模式,然后排除包含该模式的文件名。类似于!(\d{2,5}x\d{2,5}\.(jpe?g|png|gif))

理想情况下,我希望用单个命令执行此操作,而不是循环运行它或rm在移动所有文件后使用它来删除文件。任何减少多个终端命令的更好建议都很好。

答案1

您可以使用查找-not!表达式:

   -not expr
          Same as ! expr, but not POSIX compliant.

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.

因此,如果要移动foobar.jpg但不移动另外两个,您可以使用:

find . -mindepth 3 -type f -regex '.*.jpg\|.*.jpeg\|.*png\|.*gif' \
       -not -regex '.*[0-9]+x[0-9]+.*' -exec mv {} . \;

你也可以让它匹配仅有的两边各有 2-5 位数字

find . -mindepth 3  -type f -regextype posix-egrep \
       -regex '.*.jpg|.*.jpeg|.*png|.*gif' -not -regex '.*[^0-9][0-9]{2,5}x[0-9]{2,5}.*' 

相关内容