如何从目录中的一堆文件中删除一些长文件名中的文本



今天无法启动我的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安装有一个bashshell,因此您可以简化其中的一些命令。例如,您可以使用变量替换:echo "$FILENAME" | awk -F '.' '{print $NF}'将变成"${FILENAME##.*}"

  • POSIXsh中没有定义[[,因此您可能只需要将[[替换为[,但请先查看此文档: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中,如果需要,可以添加一个模式来过滤当前目录中的文件。

最新更新