如何通过在Unix中的文件名之间附加一个字符串来复制多个文件并重命名它们?

时间:2014-02-14 10:53:06

标签: shell unix

我有一些文件要复制并使用通过向每个文件添加固定字符串生成的新文件名重命名。 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

我如何实现这一目标?

2 个答案:

答案 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}"

方法很多:)