如何根据文本文件中的匹配重命名 tar.gz 文件

如何根据文本文件中的匹配重命名 tar.gz 文件

我的 Linux 计算机上的文件夹中有许多 tar.gz 文件,还有包含 tar.gz 文件名和匹配示例名称的文本文件。

Current_directory
      |_______TDF.tar.gz
      |_______DFG.tar.gz
      |_______GHY.tar.gz

当前目录中的names.txt 文件如下所示:

Tar.gz_filenames       Sample_Names
DFG.tar.gz                Sample2
TDF.tar.gz                Sample1
GHY.tar.gz                Sample3

因此,根据他们的匹配,我希望在我的 Current_directory 中得到以下输出。

Output:

Sample1.tar.gz
Sample2.tar.gz
Sample3.tar.gz

我尝试了如下但没有成功:

for j in .tar.gz ; do
  sed "s/\(\w\+\)\s\+\(\w\+\)/mv '*_\1$j' '*_\2$j'/e" names.txt
done

我的问题中的小更新:当我使用此命令时,cat -e names.txt我看到如下所示:

Tar.gz_filenames    Sample_Names^M$
DFG.tar.gz  Sample2^M$
TDF.tar.gz  Sample1^M$
GHY.tar.gz  Sample3

答案1

另一种假设文件名中没有空格的方法:

$ xargs -n2 echo mv -i <<<"$(sed '1d; s/$/.tar.gz/' names.txt)"
mv -i TDF.tar.gz Sample1.tar.gz
mv -i DFG.tar.gz Sample2.tar.gz
mv -i GHY.tar.gz Sample3.tar.gz

在 中sed '1d; s/$/.tar.gz/'1d删除输入文件名的第一行,names.txt然后在每行末尾s/$/.tar.gz/添加( ponits 到行尾)。.tar.gz$

我们xargs -n2正在读取两组用空格/或制表符分隔的字符串。

笔记:

  • 根据cat -e names.txt该文件的输出不是 Unix 类型行尾格式,要将其转换为 Unix 类型,然后dos2unix fileName应用上述命令进行重命名。

  • 移除echo以进行试运行。

链接到它是什么^M以及如何摆脱它?

答案2

假设你的名字从来没有空格,并且你的names.txt文件在第一行有一个标题,如你所显示的,你可以这样做:

tail -n +2 names.txt | while read old new; do
    mv -i "$old" "$new"
done 

将从第二行开始打印tail -n +2文件的所有行,因此它将跳过标题。然后,-iGNU 的选项mv告诉它在覆盖现有文件之前提示您(以防出现名称冲突)。

答案3

使用 shell:我假设 tarfile 名称不包含空格并且示例名称不包含空格:

{
    read header
    while read -r tarfile sample; do
        if [[ -f "$tarfile" ]]; then
            echo mv "$tarfile" "$sample.tar.gz"
        fi
    done
} < names.txt

答案4

考虑到输入文件格式,一个sed命令就足够了:

sed '1!{s/^/mv /;s/$/.tar.gz/e}' names.txt

演示,没有e

sed '1!{s/^/mv /;s/$/.tar.gz/}' names.txt

输出:

Tar.gz_filenames       Sample_Names
mv TDF.tar.gz                Sample1.tar.gz
mv DFG.tar.gz                Sample2.tar.gz
mv GHY.tar.gz                Sample3.tar.gz

相关内容