今天无法启动我的Windows PC,我使用的是第二代操作系统Linux Mint。由于我对Linux和shell脚本的了解有限,我真的不知道如何做到这一点。
我在一个由我的系统生成的目录中有一堆文件,需要删除".txt"左侧的最后12个字符
示例文件名:
filename1--2c4wRK77Wk.txt
filename2-2ZUX3j6WLiQ.txt
filename3-8MJT42wEGqQ.txt
filename4-sQ5Q1-l3ozU.txt
filename5--Way7CDEyAI.txt
期望结果:
filename1.txt
filename2.txt
filename3.txt
filename4.txt
filename5.txt
如有任何帮助,我们将不胜感激。
这里有一种程序化的方法来做到这一点,同时仍然试图解释令人讨厌的边缘情况:
#!/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 . -type f > /tmp/filenames.list
遍历文件列表
为了实现这一点,我们使用了一个while read循环:
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
从文件名模式来看,第一个标记可以在文件名的"-"之前拾取。在将目录更改为文件所在的位置后,使用以下命令重命名这些文件-
for srcFile in `ls -1`; do fileN=`echo $srcFile | cut -d"-" -f1`; targetFile="$fileN.txt"; mv $srcFile $targetFile; done
如果上述观察结果是错误的,则可以使用以下命令删除.txt(4个字符(-之前的12个字符
for srcFile in `ls -1`; do fileN=`echo $srcFile | rev | cut -c17- | rev`; targetFile="$fileN.txt"; mv $srcFile $targetFile; done
在ls -1
中,如果需要,可以添加一个模式来过滤当前目录中的文件。