今天无法启动我的Windows PC而且我是第二个OS 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
fret开头,你可以随时使用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
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
中,如果需要,可以添加模式来过滤当前目录中的文件。