我有类似的文件:alien-skull-2224154.jpg snow-birds-red-arrows-thunderbirds-blue-angels-43264.jpg dead-space-album-1053.jpg
如何在 bash 中删除 .jpg 之前的“ID”字符串 id 始终由前面的单词用“-”分隔,谢谢。
我有类似的文件:alien-skull-2224154.jpg snow-birds-red-arrows-thunderbirds-blue-angels-43264.jpg dead-space-album-1053.jpg
如何在 bash 中删除 .jpg 之前的“ID”字符串 id 始终由前面的单词用“-”分隔,谢谢。
这是使用bash 参数替换的一种方法:
for i in *.jpg; do mv "$i" "${i%-*}.jpg"; done
或者对于更一般的情况(即,如果您有其他文件扩展名),请尝试:
for i in *.*; do mv "$i" "${i%-*}.${i##*.}"; done
结果:
alien-skull.jpg
dead-space-album.jpg
snow-birds-red-arrows-thunderbirds-blue-angels.jpg
根据下面的评论,试试这个 bash 脚本:
declare -A array
for i in *.*; do
j="${i%-*}.${i##*.}"
# k="$j"
# k="${i%-*}-0.${i##*.}"
for x in "${!array[@]}"; do
if [[ "$j" == "$x" ]]; then
k="${i%-*}-${array[$j]}.${i##*.}"
fi
done
(( array["$j"]++ ))
mv "$i" "$k"
done
请注意,您需要取消注释值,k
具体取决于您希望如何格式化文件名。如果取消注释第一行,则只会增加重复的基本名称:
dead-space-album.jpg
dead-space-album-1.jpg
dead-space-album-2.jpg
dead-space-album-3.jpg
如果取消注释第二行,您将获得以下信息:
alien-skull-0.jpg
alien-skull-1.jpg
alien-skull-2.jpg
alien-skull-3.jpg
假设所有文件 ID 都是数字,您可以使用 rename 命令。
rename 's/-\d+//' *.jpg
这可能不适用于每个 *nix,因此这里有一个有用的替代链接: http ://www.cyberciti.biz/tips/renaming-multiple-files-at-a-shell-prompt.html
这是运行良好的最终代码。谢谢大家的时间!
for i in *.jpg;
do
if [[ -e "${i%-*}.jpg" ]]; then
num=1
while [[ -e "${i%-*}-$num.jpg" ]]; do
(( num++ ))
done
mv "$i" "${i%-*}-$num.jpg";
else
rename 's/-\d+//' *.jpg
fi
done