如何保留仅 20 个字符和文件扩展名 .txt 的文件名

如何保留仅 20 个字符和文件扩展名 .txt 的文件名

我有一堆这样的文件:

hhsLog.8020.20200330}1585594173}0}coll_DefaultCollectorGroup_1_158594166_132642}1036942}0}0

我只想保留前 20 个字符并添加.txt扩展名。所以最后我应该有一个名为:

hhsLog.8020.20200330.txt

我正在使用 Fedora 和 Solaris。

答案1

您可以使用 shell 循环轻松完成此操作bash

cd /path/to/files/;
for file in *; do
    echo mv -i -- "$file" "${file:0:20}.txt"
done

一旦您对所需的功能感到满意,请删除回显以实际重命名文件:

 cd /path/to/files/;
 for file in *; do
    mv -i -- "$file" "${file:0:20}.txt"
done

覆盖之前会-i询问mv新名称之一是否已存在。

答案2

Fedora 和 Solaris 支持 bash shell:

'为了'有时循环,不单独处理路径和文件名,它将处理提到的路径的前 20 个字符,但不处理实际的文件名。

因此,这将完成您想要做的事情,不会转到子目录(如果您希望处理子目录,请删除“-maxdepth 0”选项:

find /path/of/the/files/* -maxdepth 0 -type f| xargs -I[] bash -c 'val="[]";file=${val##*/};newfile=${file:0:20};mv $val ${val%/*}/$newfile.txt'  

-我xargs 中的选项将找到的每个文件名(包括路径)替换为“[]”,我们正在对每个执行 bash 命令[]->文件名我们把它存储在哪里$val变量并提取路径和文件名,单独获取文件名的前 20 个字符并将其移动,如“mv fullpath-with-filename fullpath-withoutfilename/first20charcters-of-filename”。

答案3

hhslog.*假设当前目录中所有相关文件名都匹配。然后,使用 Perlrename实用程序:

rename  's/(.{20}).*/$1.txt/' hhsLog.*

这将 Perl 替换s/(.{20}).*/$1.txt/应用于每个文件名。这会将名称截断为 20 个字符,然后还会添加.txt文件名后缀。

要截断第一个名称},请使用

rename  's/([^}]+).*/$1.txt/' hhsLog.*

或者

rename -n 's/(.+?)}.*/$1.txt/' hhsLog.*

要截断第一个不是单词字符或点的字符处的名称,请使用

rename 's/([\w.]+).*/$1.txt/' hhsLog.*

答案4

这是有效的:

for file in *
 do
 file2=$(echo ${file} | cut -c 1-20)
 mv ${file} ${file2}.txt
 done

相关内容