我有一台带有 samba 文件共享的 Ubuntu 服务器。我想查找名称中包含“&”的所有文件和文件夹,并将其替换为“and”。有人能帮我解决这种情况吗?谢谢大家,
我使用了命令,sudo find / -iname '*&'
但没有用
答案1
递归地:从下到上
您可能需要递归执行此操作,这意味着您需要确保重命名已完成从下到上。例如,如果您从最高级别开始,则下面的所有文件和文件夹都将被移动,并且需要再次找到,例如:
/folder & co/some other folder/test & file.txt
->
/folder and co/some other folder/test & file.txt
这是可以帮助的地方python
,os.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)
如何使用
- 将以下脚本复制到一个空文件中,并将其另存为
move.py
使用包含所有文件和文件夹的目录作为参数来运行它:
python3 /path/to/move.py /path/to/directory
如果路径包含空格,请使用引号:
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