1

我有一个包含图像的文件夹,我需要将它们复制到其他地方,删除正在进行的特殊字符。可以说我有这个

Folder1/ImageÑ%1.jpg
Folder1/ImageÑ%1-70x70.jpg
Folder1/ImageÑ%2.jpg
Folder1/ImageÑ%2-70x70.jpg
Folder1/ImageÑ%3.jpg
Folder1/ImageÑ%3-100x100.jpg
Folder1/ImageÑ%4.jpg
Folder1/ImageÑ%4-100x100.jpg

而且我只想将名称中没有“-70x70”或“-100x100”的文件复制到Folder2,并像这样(没有任何特殊字符):

Folder2/Image1.jpg
Folder2/Image2.jpg
Folder2/Image3.jpg
Folder2/Image4.jpg

我设法复制了文件,但我不知道如何在同一步骤中重命名文件(并删除特殊字符)。我认为它正在使用 SED,但我不知道如何。

find Folder1 -type f -regextype posix-extended \( ! -regex '.+\-[0-9]{2,4}x[0-9]{2,4}\.jpg' \) -print0 |  xargs -0 cp -p --target-directory=Folder2

谢谢!

4

3 回答 3

4

要去除奇怪的字符,我建议你排毒

然后 :

find Folder1 \( ! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) |
    xargs -i% cp -p % Folder2

编辑

找到解释:

  • 这个!字符是一个否定
  • -a选项是一个AND条件
  • 括号是用来包围条件的

编辑2

按照您的要求即时执行(用于替换奇怪的字符):

find Folder1 \( ! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) \
    -exec bash -c '
        file=$(echo "$1" | perl -pe "s/\303\221%/_weird_/g")
        cp -p "$1" "Folder2/$file"
    ' -- {} \;
于 2012-10-01T17:17:14.997 回答
2

这可能对你有用:

#!/bin/bash
DIR=/your/Folder1
DEST=/your/Folder2

for f in `ls -1 $DIR | grep .jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg"`
do
        f=$(basename $f)
        F=$(echo "$f" | sed "s/[^A-Z|a-z|0-9|\.]//g;")
        cp -p "$DIR/$f" "$DEST/$F"
done

如果需要,可以使用 MV 代替 CP。

已编辑

这将只获得您必须复制的文件:

ls -1 $DIR/*.jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg

basename命令仅获取文件名以替换奇怪的字符并准备移动 sed如果不是字母和数字(以及文件扩展名的点),它将替换所有字符

于 2012-10-01T18:10:42.710 回答
1

大概是这样的?

for file in Folder1/*.jpg; do
  case $file in
    *-70x70.jpg | *-100x100.jpg) ;;
    *) cp "$file" "Folder2/Image${file#Folder1/Image?}" ;;
  esac
done

该构造从 的值的开头${variable#pattern}删除任何匹配项。该模式匹配文字文本(然后我们预先添加静态部分)和一个任意字符。pattern$variableFolder1/Image?Folder1/ImageImage

如果违规字符不是单个字节,请尝试将问号加倍作为开始;这将匹配两个任意字符(或字节,如果您的语言环境等是这样配置的)。但是,如果您有一个组合的 Unicode 序列,则需要的远不止这些——用于表示文件名的实际字节的十六进制转储将有助于诊断这一点。无论如何,您可以简单地从另一端修剪,尽管这会涉及更多;

  *) base=${file#Folder1/}
     prefix=${base%%[0-9]*}
     cp "$file" "Folder2/Image${base#$prefix}" ;;

变体${variable%pattern}从结尾而不是开头修剪,将#or加倍%会导致外壳修剪最长的匹配项而不是最短的匹配项。(我相信最长可能匹配是 Bash 扩展?)

于 2012-10-01T17:54:12.653 回答