查找文件和文件夹中的所有“&”字符

查找文件和文件夹中的所有“&”字符

我有一台带有 samba 文件共享的 Ubuntu 服务器。我想查找名称中包含“&”的所有文件和文件夹,并将其替换为“and”。有人能帮我解决这种情况吗?谢谢大家,
我使用了命令,sudo find / -iname '*&'但没有用

答案1

递归地:从下到上

您可能需要递归执行此操作,这意味着您需要确保重命名已完成从下到上。例如,如果您从最高级别开始,则下面的所有文件和文件夹都将被移动,并且需要再次找到,例如:

/folder & co/some other folder/test & file.txt

->

/folder and co/some other folder/test & file.txt

这是可以帮助的地方pythonos.walk()工作递归地,按照参数运行topdown=False,以确保它从下到上起作用。

出于同样的原因,您需要先重命名文件,然后文件夹,下面的脚本也是如此:

剧本

#!/usr/bin/env python3
import shutil
import os
import sys

def move(subject):
    shutil.move(os.path.join(root, subject), os.path.join(root, subject.replace("&", "and")))

for root, dirs, files in os.walk(sys.argv[1], topdown=False):
    for f in files:
        move(f)
    for d in dirs:
        move(d)  

如何使用

  1. 将以下脚本复制到一个空文件中,并将其另存为move.py
  2. 使用包含所有文件和文件夹的目录作为参数来运行它:

    python3 /path/to/move.py /path/to/directory
    
  3. 如果路径包含空格,请使用引号:

    python3 /path/to/move.py '/path/to/directory'
    

答案2

您可以使用find标志-exec来调用rename找到的所有文件的命令。

find . -type f  -name "*&*" -exec rename 's/&/AND/' {} +                        

这是一个演示:

DIR:/TESTDIR
skolodya@ubuntu:$ ls

DIR:/TESTDIR
skolodya@ubuntu:$ touch "tom&jerry" "jekyl&hide"

DIR:/TESTDIR
skolodya@ubuntu:$ find . -type f  -name "*&*"
./tom&jerry
./jekyl&hide

DIR:/TESTDIR
skolodya@ubuntu:$ find . -type f  -name "*&*" -exec rename 's/&/AND/' {} +                                                    

DIR:/TESTDIR
skolodya@ubuntu:$ ls
jekylANDhide  tomANDjerry

相关内容