我有一堆这样的文件:
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