у меня есть сервер Ubuntu с совместным доступом к файлам самбы. я хочу найти все файлы и папки, которые имеют '&' на их имя замена это с 'и'. может любой помогать мне на этой ситуации. спасибо всем
я использовал команду sudo find / -iname '*&'
но это не работало
Вы могли использовать 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
Вероятно, необходимо сделать это рекурсивно, что означает, что необходимо удостовериться, что переименовывание сделано от нижней части до вершины. Если бы Вы запустили бы на высшем уровне, например, всех файлах и папках ниже, были бы буквально перемещены и должны будете быть найдены снова, например:
/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'