我有一个包含图片的文件夹,我需要将它们复制到别处,删除进度中的特殊字符。 让我说我有这个
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
谢谢!
答案 0 :(得分:4)
要删除奇怪的字符,我建议您detox
然后:
find Folder1 \( ! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) |
xargs -i% cp -p % Folder2
修改强>
找到解释:
!
字符是否定 -a
选项是AND
条件<强> EDIT2 强>
要像你要求的那样(用于替换奇怪的字符)动态地执行此操作:
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"
' -- {} \;
答案 1 :(得分: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。
<强> EDITED 强>
这将只获取您要复制的文件:
ls -1 $DIR/*.jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg
basename 命令只获取文件名以替换weir字符并准备移动 sed 如果不是字母和数字(以及文件扩展名的点),它将替换所有字符
答案 2 :(得分: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
的值的开头删除$variable
的所有匹配项。模式Folder1/Image?
匹配文字文本Folder1/Image
(我们预先添加静态Image
部分)和一个任意字符。
如果违规字符不是单个字节,请尝试将问号加倍以便开始;这将匹配两个任意字符(或字节,如果您的语言环境等以这种方式配置)。如果你有一个组合的Unicode序列,它需要更多,但是 - 用于表示文件名的实际字节的十六进制转储将有助于诊断它。无论如何,你可以简单地从另一端修剪,虽然这会涉及更多;
*) base=${file#Folder1/}
prefix=${base%%[0-9]*}
cp "$file" "Folder2/Image${base#$prefix}" ;;
变体${variable%pattern}
从末尾而不是从开头修剪,并且#
或%
加倍会导致shell修剪最长的匹配而不是最短的匹配。 (我相信最长的匹配是Bash扩展吗?)