将当前目录中的所有文件重命名为文本文件中列出的名称

将当前目录中的所有文件重命名为文本文件中列出的名称

原标题是:使用类似命令序列的 vim 注入 vidir

我一直在尝试使用 vidir 重命名多个文件,这些文件被某人意外重命名。问题是 vidir 不使用文件的排序顺序,它有时会随机选择。我的文件弄乱了,我必须使用 ls -rt 重命名它们

问题: 文件全部随机重命名。但我有一个文本文件,其中包含按 ls -rt 顺序排列的所有文件的名称。想要使用该文本文件读取名称并使用ls -rt顺序重命名文件夹中的文件

ls -rt输出

cbb308e52a3345e4ff436b2f
a4b8e2aacae0a3304b3c28b8
43ca3253da336012788d3279~
ada694316cc605c7ffb790d1
3b6cc01ff2aaa5b1709918ef
7057cbda90a7adf303a56bb4~
7c0dd50bc52bb444000cc175

Txt_with_Names_In_Order

e0e87002d27674ddafdb5f7077887da6-1.ps
c7685093e84da8074859efc5783687b6-2.ps
062936279f54f4f5a541b5bee4daf5d4-3.ps
6f91bb10840a4a5a5331c832e5c2beb1-4.ps
9a8c5e9ae8b633a2a588518d2b9ab656-5.ps
bcb77709b10eafbd2fc88ce8db41ed3f-6.ps
e65c35be3c8b0aa051fb33ed2ce43ff7-7.ps

解决方案:

现在,可以通过循环来完成,但是当 vidir 很快派上用场时,编写长循环命令是不可行的。

我的 vim 命令序列包括

^[ggVGg^A some regex
ls -rt | vidir -

以上可以工作,但需要交互式工作。

想要注入像这样的序列

ls -rt | vidir - << EOF
commands
EOF

或者

vim file << EOF sequence EOF ------> it works
command | vim - << EOF sequence of vim commands to edit input ELF ----> Want a workaround for this

但输入似乎是矛盾的。

如果可能的话,任何人都可以提供帮助。

[不想使用expect]任何人都可以帮忙:

如何在 vim ex 模式下直接从命令行使用 ^[ggVgg^A ?

我正在尝试的是将某些命令的输出通过管道传输到 vim,并注入 vim 命令序列以非交互方式作用于该管道输入

答案1

您寻求解决方案的请求基于vim或是vidir典型的XY问题

据我了解您的问题,真正的要求是将当前目录中的现有文件重命名为文本文件中按顺序排列的名称ls -rt

以下解决方案bash假设当前文件名和保存的文件名都不包含空格、换行符或其他有问题的字符,并且文本文件每行包含一个文件名。

readarray -t new < /path/to/filenames.txt ; \
i=0 ; \
ls -rt1 | while read -r old
do
    echo mv "$old" "${new[$i]}"
    ((i++))
done

上面的脚本将仅显示将执行的命令。如果输出符合您的要求,请删除echo之前的内容mv并再次运行脚本以实际重命名文件。

答案2

这可以通过 shell 命令(bash)轻松解决。首先备份文件夹。

创建一个包含正确顺序的坏名称的文件:ls -tr > badnames.txt 因此,这两个文件具有正确顺序的好名称和坏名称。将它们合并在一起:

paste badnames.txt TXT_with_Names_In_Order > bothnames.txt

最后输入:

while read BADNAME GOODNAME
do
mv $BADNAME $GOODNAME
done < bothnames.txt

这段代码读取 Bothnames.txt 文件的一行,并将其拆分为两个变量。然后它使用 mv 命令重命名您的文件。

相关内容