这是一种编程方式,同时仍试图解决令人讨厌的边缘情况:
#!/bin/sh
set -e
find . -name "filename*" > /tmp/filenames.list
while read -r FILENAME; do
NEW_FILENAME="$(
echo "$FILENAME" | \
awk -F '.' '{$NF=""; gsub(/ /, "", $0); print}' | \
awk -F '/' '{print $NF}' | \
awk -F '-' '{print $1}'
)"
EXTENSION="$(echo "$FILENAME" | awk -F '.' '{print $NF}')"
if [[ "$EXTENSION" == "backup" ]]; then
continue
else
cp "$FILENAME" "${FILENAME}.backup"
fi
if [[ -z "$EXTENSION" ]]; then
mv "$FILENAME" "$NEW_FILENAME"
else
mv "$FILENAME" "${NEW_FILENAME}.${EXTENSION}"
fi
done < /tmp/filenames.list
创建要编辑的文件列表
首先创建一个您想要编辑的文件列表(假设它们都以filename 开头)并在当前工作目录(.)下:
find . -name "filename*" > /tmp/filenames.list
如果它们不是以 filename 开头的,你可以随时使用 find 命令,例如:
find . -type f > /tmp/filenames.list
遍历文件列表
为了实现这一点,我们使用了一个 while 读取循环:
while read -r LINE; do
# perform action
done < file
如果你有能力使用bash,你总是可以使用命名管道重定向:
while read -r LINE; do
# perform action
done < <(
find . -type f
)
创建重命名变量
接下来,我们创建一个变量 NEW_FILENAME 并使用 awk 去除文件扩展名和任何尾随空格:
awk -F '.' '{$NF=""; gsub(/ /, "", $0); print}'
如果您确定文件名中没有多个句点,我们可以使用以下内容:
awk -F '.' '{print $1}'
前导 ./ 被去掉
awk -F '/' '{print $NF}'
虽然这可以通过basename轻松完成
使用以下命令,我们将删除第一个 - 之后的所有内容:
awk -F '-' '{print $1}'
创建备份
如果您认为不必要,请随时删除:
if [[ "$EXTENSION" == "backup" ]]; then
continue
else
cp "$FILENAME" "${FILENAME}.backup"
fi
我们绝对不想要的一件事是对备份进行备份。上述逻辑说明了这一点。
重命名文件
我们不想做的一件事是在没有扩展名的文件名上附加句点。这就是原因。
if [[ -z "$EXTENSION" ]]; then
mv "$FILENAME" "$NEW_FILENAME"
else
mv "$FILENAME" "${NEW_FILENAME}.${EXTENSION}"
fi
其他注意事项
很可能你的 Linux Mint 安装有一个 bash shell,所以你可以简化其中的一些命令。例如,您可以使用变量替换:echo "$FILENAME" | awk -F '.' '{print $NF}' 将变为 "${FILENAME##.*}"
[[ 未在 POSIX sh 中定义,因此您可能只需将 [[ 替换为 [,但请先查看此文档:
https://mywiki.wooledge.org/BashFAQ/031