Shell 通过删除最后n个字符重命名文件
我想通过删除最后N个字符来重命名文件 例如,我想通过删除最后7个字符来重命名这些文件 发件人: 致: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)} 可
这在单个命令中可行吗?根据您所说的单个命令的含义,至少您可以使用一些管道:
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"`