我希望此命令成为一种条件,如果文件包含字符^,然后重命名或将其替换为新名称,但如果不包含该字符,则忽略此条件。谢谢!
注意:$ 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
答案 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
,因为我不在乎。