输出目录中所有文件名的列表,每个文件名删除最后 5 个字符

输出目录中所有文件名的列表,每个文件名删除最后 5 个字符

我有一个包含带有名称的文件的目录,

00004.time, 00010.time, ...

除了格式之外没有图案,

<5 decimal digits>.time

我想将按升序排列的数字输出到文件中。如何通过命令行或脚本执行此操作?

答案1

在 bash shell 中,你可以使用以下命令从包含文件名的变量中删除“点扩展名”(与句点后跟任意数量的字符匹配的最短尾随模式)参数扩展例如,如果 f=00004.time${f%.*}计算结果为00004

将其放在 shell glob 的循环中,

for f in *.time; do printf '%s\n' "${f%.*}"; done

顺序将由 glob ( ) 扩展决定*.time,并将是您所在语言环境的默认排序顺序 - 对于您显示的输入,该顺序应为数字升序。要将结果发送到文件,请使用 shell 重定向

for f in *.time; do printf '%s\n' "${f%.*}"; done > somefile

如果你真的想要删除最后 5 个字符而不是(更通用的)点扩展名,您可以将其修改为

for f in *.time; do printf '%s\n' "${f%?????}"; done > somefile

答案2

此外steeldriver 的回答,由于所有文件要排除的子字符串都是相同的,因此可以使用 的bash参数扩展的替换操作:

for file in *.time; do echo "${file/.time/}"; done | sort -n > file.txt

这将.time用空字符串替换,即.time从文件名中排除。

替换操作的语法是

${Parameter/OLD/NEW}

如果您希望将所有出现的都替换为OLD,这将仅用 替换第一次出现的:NEWOLDNEW

${Parameter//OLD/NEW}

答案3

所以你只想要数字,不想要.time部分。我的看法如下:

ls /path/to/*.time | cut -d '.' -f1  > toSomeFile.txt

答案4

通过组合执行相同操作basename命令如下:

find /path/to/dir -name '*.time' -exec basename {} .time \; > someFile

basename {} .time,从文件名中删除“.time”后缀。代表
当前{}找到的文件名。

相关内容