使用 .txt 文件重命名文件夹

Dit*_*tte 7 command-line bash files rename

我正在我的终端中使用 bash 尝试重命名文件夹:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

我想根据 a.txt 文件重命名它们:

a 2
c 3
d 5
e 1
b 4
Run Code Online (Sandbox Code Playgroud)

.txt 文件中的顺序是完全随机的。我希望找到一种方法可以重命名文件夹,使它们变为:

1 > e
2 > a
3 > c
4 > b
5 > d
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

非常感谢!

mur*_*uru 6

你可以使用xargsmv

xargs -r -a /path/to/file.txt -L1 mv
Run Code Online (Sandbox Code Playgroud)

(假设您位于文件所在的目录中)。

xargs 将输入转换为命令的参数。

  • -a foo从 中读取输入foo
  • -L1 每个命令调用只使用一行输入。
  • -r 如果该行为空,则避免运行该命令

例如,使用echo mv而不是mv显示正在运行的命令:

$ xargs -r -a foo.txt -L1 echo mv
mv a 2
mv c 3
mv d 5
mv e 1
mv b 4
Run Code Online (Sandbox Code Playgroud)

您还可以在运行命令之前使用该-p选项进行xargs确认:

$ xargs -r -p -a foo.txt -L1 mv
mv a 2 ?...n
mv c 3 ?...n
mv d 5 ?...y
mv e 1 ?...mv: cannot stat ‘d’: No such file or directory
n
mv b 4 ?...
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是个问题。关于非 Ubuntu 系统的问题应该在 [unix.se] 上提问。从这里可以看出,命令可以不同。 (2认同)

Jac*_*ijm 4

假设列表中的名称不包含空格(名称之间除外) ,下面的脚本将以递归方式重命名文本文件中的文件夹。它将读取文件的行,将它们分成两部分(新名称,旧名称),将由行中第二个字符串命名的出现的文件夹重命名为行中的第一个字符串。

正如前面提到的,它将在目录树中从下到上递归地执行此操作。这可以防止脚本中出现问题,尝试重命名可能已重命名的父文件夹中的文件夹。

#!/usr/bin/env python
import os
import shutil

# -- set the (absolute) path to the targeted folder below
dr = "/home/jacob/Bureaublad/testfolder"
# -- set the path to the textfiles below
ren = "/home/jacob/Bureaublad/testfolder/renfile.txt"

renlist = [cpl for cpl in [l.split() for l in open(ren).readlines()] if cpl]
currnames = [r[1] for r in renlist]

for root, dirs, files in os.walk(dr, topdown = False):
    for dr in dirs:
        try:
            # look up the name, pass if not in the list
            i = currnames.index(dr)
        except ValueError:
            pass
        else:
            newname = renlist[i][0]
            shutil.move(root+"/"+dr, root+"/"+newname)
Run Code Online (Sandbox Code Playgroud)

如何使用

  1. 将脚本复制到一个空文件中(在纯文本编辑器中),将其另存为rename.py
  2. 在脚本的头部,设置文本文件和目录的真实路径
  3. 通过命令运行它(在终端中):

    python /path/to/rename.py
    
    Run Code Online (Sandbox Code Playgroud)

解释

剧本:

  • 创建姓名情侣列表:newname/oldname
  • 使用 python os.walk(),它会从下到上递归地查找您的目录。
  • 如果文件夹的名称与名称对的第二项匹配,则会将该文件夹重命名为第一个名称。
  • 如果文件夹的名称未列出,则它将保持不变。