Shell 通过删除最后n个字符重命名文件

Shell 通过删除最后n个字符重命名文件,shell,unix,Shell,Unix,我想通过删除最后N个字符来重命名文件 例如,我想通过删除最后7个字符来重命名这些文件 发件人: 致: 这在单个命令中可行吗?根据您所说的单个命令的含义,至少您可以使用一些管道: mv file.txt.123456 $(ls file.txt.123456 | rev | cut -c8- | rev) 看看你的例子,我想知道像“从最后一个点到结尾删除字符”这样的模式是否更合适。你在使用bash吗 file="file.txt.123456" mv $file ${file::(-7)} 可

我想通过删除最后N个字符来重命名文件

例如,我想通过删除最后7个字符来重命名这些文件

发件人:

致:


这在单个命令中可行吗?

根据您所说的单个命令的含义,至少您可以使用一些管道:

mv file.txt.123456 $(ls file.txt.123456 | rev | cut -c8- | rev)
看看你的例子,我想知道像“从最后一个点到结尾删除字符”这样的模式是否更合适。

你在使用bash吗

file="file.txt.123456"
mv $file ${file::(-7)}

可以使用删除固定数量的字符

mv "$file" "${file%???????}"  # 7 question marks to match 7 characters
这将在任何兼容POSIX的shell中工作

要删除最后一个扩展名(可能多于或少于7个字符),请使用

要在给定的扩展之后修剪所有内容,可以尝试

EXT=csv
mv "$file" "${file%.$EXT.*}".$EXT

它实际上删除了
$EXT
及其后的所有内容,但随后又重新附加了
$EXT

这与Adam的类似,但没有bashisms(因为它被标记为shell而不是bash)


如果我只希望文件扩展名为.csv,该怎么办?我不知道你在问什么
mv“$file”“${file%.csv}”
将从文件名中删除
.csv
,但不会删除另一个扩展名(这将是不可操作的,因为您只需将文件重命名为自身)假设我有一个文件名
file.12323.csv.txt.13123
,我希望它是
file.12323.csv
好问题:)我会看看我能想出什么。
${foo:offset:length}
与Adam使用的bashism相同。不过其他shell也支持它,例如busybox-ash,而另一种方法则不支持。我看到的唯一区别是Adam使用负长度,而您计算的是显式的正长度。:()不同于:${start}:${length},并且不支持
()
,但是$((整数ops))也不是子字符串操作的负值,所以从位置开始:0(零不是必需的,但保留在适当的位置以显示意图)并将字符串${#varname}的长度减去我们需要提取的金额,该金额必须在$(())中完成在bash之外。我经常使用busybox ash,所以差异非常明显。好吧,看来
ash
bash
有两个相同非标准构造的稍微不同的实现。很高兴知道。这对我来说已经工作了很多次。现在突然我得到了错误:-bash:(-7):子字符串表达式<0。有什么想法吗?您的字符串太短,并且您要求bash删除的字符比它的多。:)但是我的文件名非常长?与此类似:
T591\u Name\u Anothername\u L200.fasta.new.new
。我在循环中使用它,就像我在过去做过一百万次一样<代码>用于*.new中的文件;做mv$file${file::(-7)};完成。
我很困惑。
mv "$file" "${file%???????}"  # 7 question marks to match 7 characters
mv "$file" "${file%.*}"
EXT=csv
mv "$file" "${file%.$EXT.*}".$EXT
remove_n(){
  echo ${2:0:$((${#2}-$1))}
}

remove_n 8 file.txt.1234567
#remove last 8 characters from 2nd argument
#for filenames in variables use
mv "$VAR" `remove_n 8 "$VAR"`