对于带有if then else语句的命令?

时间:2018-08-28 00:17:35

标签: shell scripting

我希望此命令成为一种条件,如果文件包含字符^,然后重命名或将其替换为新名称,但如果不包含该字符,则忽略此条件。谢谢!

注意:$ f应该是f的结果。

for f in ./*.png; do mv "$f" "${f%%^*}${f#*^}" ; done

示例:

ABC4312315_22 ^ _44_25x60.png ---> ABC4312315_22_44_25x60.png ABC4312315_22 ^ _22_125x260.png ---> ABC4312315_22_22_125x260.png

6 个答案:

答案 0 :(得分:2)

为什么要循环播放?

删除其中所有带有^的文件:

find . -type f -name "*^*.png" -delete

将名称中带有^的所有文件重命名为其中没有^的名称:

find . -type f -name "*^*.png" -execdir bash -c 'mv "${1}" "${1//^/}"' -- {} \;

最后一步:

  • find .-在当前目录(和子目录)中查找...
  • -type f-文件
  • -name "*^*.png"-名称与模式匹配
  • -execdir-在比赛目录中执行
  • bash -c '...' -- {}-一个子外壳,以匹配名称({})作为位置参数($1
  • mv "${1}" "${1//^/}"-将$1重命名为$1,并删除所有出现的'^'
  • \;-exec编辑命令的结尾

子shell是必需的,因为我还没有找到直接在find的{}上应用bash参数扩展的方法。 ;-)

man find-瑞士军刀,用于“操作一组文件”。 ;-)

答案 1 :(得分:1)

这是一种方法。不知道您是否需要更多。 (请注意,我在其中放置了多余的echo只是为了演示!)

$ touch 'ignore1.png' 'ignore2.png' 'ick^ick.png' '^ick.png' 'ick^.png'
$ for f in ./*^*.png; do echo mv "$f" "${f%%^*}${f#*^}" ; done
mv ./^ick.png ./ick.png
mv ./ick^.png ./ick.png
mv ./ick^ick.png ./ickick.png
$

如果您不需要真正忽略其他文件:

$ for f in ./*.png
do
  if [[ "$f" = *'^'* ]]
  then
    echo mv "$f" "${f%%^*}${f#*^}"
  else
    echo "ignoring $f"
  fi
done
mv ./^ick.png ./ick.png
mv ./ick^.png ./ick.png
mv ./ick^ick.png ./ickick.png
ignoring ./ignore1.png
ignoring ./ignore2.png
$

答案 2 :(得分:1)

删除它们:

for f in *\^*.png; do rm -- "$f"; done

例如,创建一个新目录:

$ mkdir a
$ cd a

创建一些文件:

$ touch gorp.png bla.png foo.png splut.png jd\^holt.png fo\^o.png gorp\^ers.png \^firsty.png lasty\^.png

列出它们以确认它们已创建:

$ ls

您应该看到类似这样的内容:

$ ls
^firsty.png fo^o.png    gorp.png    jd^holt.png splut.png
bla.png     foo.png     gorp^ers.png    lasty^.png

然后删除带有^字符的字符,如下所示:

$ for f in *\^*.png; do rm -- "$f"; done

确认它们已消失:

$ ls
bla.png     foo.png     gorp.png    splut.png

删除时要小心-不能撤消。 :)

答案 3 :(得分:0)

根据您在问题中描述的内容,如果要删除文件,则无需循环。

rm -v *\^*.png

如果您坚持使用循环(即,您不仅要删除文件,还想做更多事情):

for f in ./*.png; do 
  if [[ $string = *"My long"* ]]; then
    mv "$f" "${f%%^*}${f#*^}"
  else
    #something else
  fi
done

答案 4 :(得分:0)

使用Bash。首先几个测试文件:

$ touch yes^this.txt not_this.txt

然后:

$ for f in *this* ; do if [[ "$f" =~ \^ ]] ; then mv "$f" "${f//^/}" ; fi ; done
$ ls *this*
not_this.txt  yesthis.txt

解释:

for f in *this*          # loop files with this in file name 
do 
  if [[ "$f" =~ \^ ]]    # bash regex match
  then 
    mv "$f" "${f//^/}"   # bash substring replacement
  fi
done

答案 5 :(得分:0)

只需变量替换即可:

for f in ./*.png; do mv "$f" "${f//^/}" 2>/dev/null ; done

我不会为if测试感到困扰,因为尝试将文件移至其自身没有任何危害。我将错误输出传递到/dev/null,因为我不在乎。