今天无法启动我的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
任何帮助将不胜感激。
答案 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
中,可以根据需要添加一个模式来过滤当前目录中的文件。