【发布时间】:2013-11-01 01:33:16
【问题描述】:
我想通过删除最后 N 个字符来重命名文件
例如,我想通过删除最后 7 个字符来重命名这些文件
发件人:
file.txt.123456
收件人:
file.txt
这在单个命令中是否可行?
【问题讨论】:
我想通过删除最后 N 个字符来重命名文件
例如,我想通过删除最后 7 个字符来重命名这些文件
发件人:
file.txt.123456
收件人:
file.txt
这在单个命令中是否可行?
【问题讨论】:
根据您对单个命令的含义,至少您可以使用一些管道来完成:
mv file.txt.123456 $(ls file.txt.123456 | rev | cut -c8- | rev)
看看你的例子,我想知道“从最后一个点到末尾删除字符”这样的模式是否更合适。
【讨论】:
你在使用 bash 吗?
file="file.txt.123456"
mv $file ${file::(-7)}
【讨论】:
T591_Name_Anothername_L200.fasta.new.new。我在循环中使用它,因为我过去做过一百万次。 for file in *.new; do; mv $file ${file::(-7)}; done.我很困惑。
您可以使用删除固定数量的字符
mv "$file" "${file%???????}" # 7 question marks to match 7 characters
这适用于任何符合 POSIX 标准的 shell。
要删除最后一个扩展名(可能多于或少于 7 个字符),请使用
mv "$file" "${file%.*}"
要在给定扩展名之后修剪所有内容,您可以尝试
EXT=csv
mv "$file" "${file%.$EXT.*}".$EXT
实际上删除了.$EXT 和之后的所有内容,但随后重新附加了.$EXT。
【讨论】:
mv "$file" "${file%.csv}" 将从文件名中删除 .csv,但不会删除另一个扩展名(这将是一个无操作,因为您只需将文件重命名为自身)。
file.12323.csv.txt.13123,我希望它是file.12323.csv
这类似于亚当的,但没有 bashisms(因为它被标记为 shell 而不是 bash)。
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"`
【讨论】:
${foo:offset:length} 与 Adam 使用的 bashism 相同。
() 不受支持,但 $((integer ops)) 也不是子字符串操作的负值,所以从位置 :0 开始(零不是必需的,而是留在原地以显示意图),然后将字符串 ${#varname} 的长度减去我们需要取出的金额,这必须在 $( ()) 在 bash 之外。我经常使用busybox ash,所以差异很明显。
ash 和bash 对同一个非标准结构有两个稍微不同的实现。很高兴知道。