我有一个包含带有名称的文件的目录,
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
,这将仅用 替换第一次出现的:NEW
OLD
NEW
${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”后缀。代表
当前{}
找到的文件名。