我的 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
以进行试运行。
答案2
假设你的名字从来没有空格,并且你的names.txt
文件在第一行有一个标题,如你所显示的,你可以这样做:
tail -n +2 names.txt | while read old new; do
mv -i "$old" "$new"
done
将从第二行开始打印tail -n +2
文件的所有行,因此它将跳过标题。然后,-i
GNU 的选项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