如何在unix中获取文件的前n个字符

如何在unix中获取文件的前n个字符,unix,Unix,我必须检查文件名是否大于45个字符 如果是这样,我需要重命名文件名的前45个字符 假设我的文件名是1234567890121345678901234567890123456789012345678901234567890.txt,那么我的文件名应该重命名为123456789001234567890123456789012345.txt这应该有效(假设$f是包含文件名的变量): f=12345678901234567890123456789012345678901234567890.txt tou

我必须检查文件名是否大于45个字符 如果是这样,我需要重命名文件名的前45个字符

假设我的文件名是1234567890121345678901234567890123456789012345678901234567890.txt,那么我的文件名应该重命名为123456789001234567890123456789012345.txt

这应该有效(假设
$f
是包含文件名的变量):

f=12345678901234567890123456789012345678901234567890.txt
touch $f
mv $f "`echo $f|cut -c1-45`.txt"
这应该有效(假设
$f
是包含文件名的变量):


为了避免硬编码文件扩展名,可以使用sed。请注意,如果文件名有多个句点,则此操作将失败<代码>$echo'12345678001345678901234567890123456789012345678901234567890.txt'|sed-r-e's/^([^\.]{0,45})。*.(.*)$/\1\.\2/'
12345689012345678901234567890123456789012345.txt
为避免硬编码文件扩展名,可以使用sed。请注意,如果文件名有多个句点,则此操作将失败<代码>$echo'12345679012345678901234567890123456789012345678901234567890.txt'| sed-r-e's/^([^\.]{0,45})。*.(.*)$/\1\.\2/'
12345689012345678901234567890123456789012345.txt
这只在Bash中有效。其他类似Bourne的shell没有
[[
${…::}
@pts:是的,旧的shell没有,但是现在所有现代的Unix、Linux、OSX系统都是以bash作为默认shell提供的。@anubhava很多,也许是大多数,但肯定不是全部…@anubhava对我来说是这样的,但最好不要夸大…@twalberg:关于它的争论没有意义,因为OP没有选择被接受的答案我已经评论过
是的,旧的shell不会有它
这只在Bash中有效。其他类似Bourne的shell没有
[[[/code>或
${……:}
@pts:是的,旧的shell没有,但是现在所有现代的Unix、Linux、OSX系统都是以bash作为默认shell提供的。@anubhava很多,也许是大多数,但肯定不是全部…@anubhava对我来说是这样的,但最好不要夸大…@twalberg:关于它的争论没有意义,因为OP没有选择被接受的答案我已经评论过
是的,旧的shell不会有它
[[ ${#f} -gt 45 ]] && mv "$f" "${f:0:45}"