Найти все символы '&' в файлах и папках

У меня есть сервер Ubuntu с общим доступом к файлам Samba. Я хочу найти все файлы и папки, которые имеют "&" в названии, заменить его на "и". Может ли кто-нибудь помочь мне в этой ситуации. Спасибо вам всем
я использовал команду sudo find / -iname '*&' но это не сработало

2 ответа

Рекурсивно: снизу вверх

Возможно, вам нужно сделать это рекурсивно, а это значит, что вам нужно убедиться, что переименование выполняется снизу вверх. Например, если вы начнете с самого высокого уровня, все файлы и папки, перечисленные ниже, будут буквально перемещены, и их нужно будет найти снова, например:

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

->

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

Это где python"s 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)  

Как пользоваться

  1. Скопируйте приведенный ниже скрипт в пустой файл и сохраните его как move.py
  2. Запустите его с каталогом со всеми вашими файлами и папками в качестве аргумента:

    python3 /path/to/move.py /path/to/directory
    
  3. если путь включает пробелы, используйте кавычки:

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

Вы могли бы использовать 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
Другие вопросы по тегам