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

时间:2018-12-04 15:48:56

标签: sh

今天无法启动我的Windows PC,并且我在2nd 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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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开头,那么您始终可以使用以下查找命令:

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

答案 1 :(得分: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中,可以根据需要添加一个模式来过滤当前目录中的文件。