【问题标题】:How to remove some text in long filename from bunch of files in directory如何从目录中的一堆文件中删除长文件名中的一些文本
【发布时间】:2018-12-09 15:45:55
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

标签: sh


【解决方案1】:

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

#!/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 命令,例如:

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

【讨论】:

    【解决方案2】:

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

    for srcFile in `ls -1`; do fileN=`echo $srcFile | cut -d"-" -f1`; targetFile="$fileN.txt"; mv $srcFile $targetFile; done
    

    如果上述观察有误,可以使用以下命令将 .txt 前的 12 个字符(4 个字符)删除 -

    for srcFile in `ls -1`; do fileN=`echo $srcFile | rev | cut -c17- | rev`; targetFile="$fileN.txt"; mv $srcFile $targetFile; done
    

    ls -1 中,如果需要,可以添加一个模式来过滤当前目录中的文件。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 2021-10-28
      • 2022-01-27
      • 1970-01-01
      相关资源
      最近更新 更多