Чего я хочу?

Учитывая следующую структуру каталогов:

.
├── bar.py
├── hap
│   ├── bla.py
│   └── tests
│       └── test_hap.py
└── hip
    ├── testimony.py
    └── tests
        ├── foo.py
        └── test_hip.py

Я хотел бы перейти к следующему:

.
├── bar.py
├── hap
│   ├── bla.py
│   └── tests
│       └── test_hap.py.bad
└── hip
    ├── testimony.py
    └── tests
        ├── foo.py
        └── test_hip.py.bad

Итак, я хочу , чтобы добавить .bad ко всем файлам , начиная с test_ , которые находятся в директории tests

Что я пробовал?

Из советов, приведенных в этой теме, я попробовал следующее:

shopt -s globstar
rename "s/tests\/test_.*/tests\/test_.*\.bad/" **

Но .* В new части шаблона замены s/old/new , по-видимому, автоматически экранируется. Как я могу позволить второму .* Интерпретировать как регулярное выражение?

Кроме того, используя test_.*\.bad$ дает мне следующее:

Final $ should be \$ or $name at (eval 1) line 1, within string 

1 ответ1

1

Find отлично подходит для таких вещей (обратите внимание, что это может работать, только если у ваших путей нет пробелов).

find /directory/path -type f -name "test_*" -exec mv {} {}.bad \;

Find может фильтровать по дереву каталогов, чтобы найти то, что вы хотите, а затем аргумент exec для поиска позволяет подставить все, что было найдено, в "{}".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .