根据单独的 txt 文件中的名称重命名 .gz 文件

Yos*_*shi 4 linux gzip rename

我想根据单独的 txt 文件中的名称重命名 .gz 文件。我有一张包含 .gz 文件的地图,其名称为:

trooper10.gz
trooper11.gz 
trooper12.gz
etc.
Run Code Online (Sandbox Code Playgroud)

我有一个单独的 txt 文件,其中第一列中包含所需名称,另一列中包含 .gz 名称(制表符分隔)。

B25    trooper10
C76    trooper11
A87_2    trooper12
Run Code Online (Sandbox Code Playgroud)

所以文件应该像这样重命名

B25.gz
C76.gz
A87_2.gz
Run Code Online (Sandbox Code Playgroud)

我试过

for i in *.gz; do
line=$(grep -x -m 1 -- "${i}" /path_to_txtfile/list_names.txt)
Run Code Online (Sandbox Code Playgroud)

但我不确定如何 grep txt 文件中的相应列。由于gz文件很多,我想问一下有什么办法吗?

ter*_*don 8

是的,您只需从读取文件开始,而不是从文件系统获取 gz 文件:

while IFS=$'\t' read -r newName oldName; do
    mv -- "$oldName".gz "$newName.gz"
done < names_file
Run Code Online (Sandbox Code Playgroud)

  • @Yoshi 那是因为你似乎使用的是 Windows 而不是 Linux?您的文件是带有 Windows 行结尾的 Windows 文本文件。使用“dos2unix names_file”或“sed -i 's/\r//”names_file”修复文件,然后重试。 (4认同)

Sté*_*las 5

难道不只是:

<list_names.txt awk -F'\t' '{printf "%s.gz\0%s.gz\0", $2, $1}' | xargs -r0n2 mv --
Run Code Online (Sandbox Code Playgroud)

或者更有效:

perl -F'\t' -lae 'rename "$F[1].gz", $"F[0].gz" or warn "$F[1].gz: $!\n"' list_names.txt
Run Code Online (Sandbox Code Playgroud)