找到& Xargs通过bash脚本复制和重命名

时间:2012-10-01 17:13:02

标签: linux bash command-line find xargs

我有一个包含图片的文件夹,我需要将它们复制到别处,删除进度中的特殊字符。 让我说我有这个

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

谢谢!

3 个答案:

答案 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扩展吗?)