我有一些文件要复制并使用通过向每个文件添加固定字符串生成的新文件名重命名。 E.g:
ls -ltr | tail -3
games.txt
files.sh
system.pl
输出应为:
games_my.txt
files_my.sh
system_my.pl
我能够在文件名末尾追加,但不能在* .txt之前追加。
for i in `ls -ltr | tail -10`; do cp $i `echo $i\_my`;done
我在想如果我能够通过简单的剪切保存每个文件的扩展名,如下所示,
ext=cut -d'.' -f2
然后我可以在上面的for循环中附加相同的内容。
do cp $i `echo $i$ext\_my`;done
我如何实现这一目标?
答案 0 :(得分:1)
您可以使用以下内容:
for file in *
do
name="${file%.*}"
extension="${file##*.}"
cp $file ${name}_my${extension}
done
请注意,${file%.*}
会返回没有扩展名的文件名,因此从hello.txt
获取hello
。通过${file%.*}_my.txt
,您可以从hello.txt
获取 - > hello_my.txt
。
关于扩展程序,extension="${file##*.}"
获取它。它基于问题Extract filename and extension in bash。
答案 1 :(得分:0)
如果fedorqui的答案提供的shell变量扩展机制看起来太难以理解,你也可以使用带有第二个参数的unix工具basename
去除后缀:
for file in *.txt
do
cp -i "$file" "$(basename "$file" .txt)_my.txt"
done
顺便说一句,在这种情况下,我总是建议对-i
应用cp
选项,以防止由于输入错误或类似错误而导致的任何不必要的覆盖。
也可以使用shell方法直接替换:
cp -i "$file" "${file/.txt/_my.txt}"
方法很多:)