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

问题描述 投票:0回答:2

今天无法启动我的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

任何帮助将不胜感激。

sh
2个回答
0
投票

这是一种编程方式,同时仍然试图解释讨厌的边缘情况:

#!/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

其他注意事项

  • 很可能你的Linux Mint安装有一个bash shell,所以你可以简化其中的一些命令。例如,您可以使用变量替换:echo "$FILENAME" | awk -F '.' '{print $NF}'将成为"${FILENAME##.*}"
  • [[没有在POSIX sh中定义,因此您可能只需要用[[替换[,但首先请查看此文档:https://mywiki.wooledge.org/BashFAQ/031

0
投票

从文件名的模式看起来,第一个令牌可以在“ - ”之前从文件名中选取。将目录更改为文件所在的目录后,使用以下命令重命名这些文件 -

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中,如果需要,可以添加模式来过滤当前目录中的文件。

© www.soinside.com 2019 - 2024. All rights reserved.