How to replace consecutive characters from directory names, recursively

Каков наилучший способ заменить все последовательные символы, такие как _+-."'? из каталога и всех имен подкаталогов с помощью GNU bash, версия 4.3, с использованием инструментов awk, sedPerl rename или же find?

Как предложил @Ralf перефразировать:

Примером может быть переименование каталогов из

inital_situation. ├── dir1---FooFoo---xFoo.FOO │   └── file1---FooFoo---xFoo.FOO.mp4 ├── dir2+++FooFOO___xFoo.FOO │   └── file2___FooFOO___xFoo.FOO.mp4 ├── dir3...FooFOO...xFoo...FOO │   └── file3...FooFOO...xFoo...FOO.mp4 ├── dir4._-FOO._-xFoo._-FOO │   └── file4._-FOO._-xFoo._-FOO.mp4 ├── dir5+++FOO_-_FOO_-_FOO_-_FOO_-_FOO_-_FOO_-_xFoo │   └── file5_-_FOO_-_FOO_-_FOO_-_FOO_-_FOO_-_FOO_-_xFoo.mp4 ├── file1---FooFoo---xFoo.FOO.mp4 ├── file2+++FooFOO___xFoo.FOO.mp4 ├── file3...FooFOO...xFoo...FOO.mp4 ├── file4._-FOO._-xFoo._-FOO.mp4 ├── file5+++FOO_-_FOO_-_FOO_-_FOO_-_FOO_-_FOO_-_xFoo.mp4 ├── xFoo_-[xFoo]_-[dir6] │   └── xFoo_-[xFoo]-file6.mp4 └── xFoo_-[xFoo]-file6.mp4

в

Ожидаемые результаты. ├── dir1-FooFoo-xFoo-FOO │   └── file1-FooFoo-xFoo-FOO.mp4 ├── dir2-FooFOO-xFoo-FOO │   └── file2-FooFOO-xFoo-FOO.mp4 ├── dir3-FooFOO-xFoo-FOO │   └── file3-FooFOO-xFoo-FOO.mp4 ├── dir4-FOO-xFoo-FOO │   └── file4-FOO-xFoo-FOO.mp4 ├── dir5-FOO-FOO-FOO-FOO-FOO-FOO-xFoo │   └── file5-FOO-FOO-FOO-FOO-FOO-FOO-xFoo.mp4 ├── file1-FooFoo-xFoo-FOO.mp4 ├── file2-FooFOO-xFoo-FOO.mp4 ├── file3-FooFOO-xFoo-FOO.mp4 ├── file4-FOO-xFoo-FOO.mp4 ├── file5-FOO-FOO-FOO-FOO-FOO-FOO-xFoo.mp4 ├── xFoo-xFoo-dir6 │   └── xFoo-xFoo-file6.mp4 └── xFoo-xFoo-file6.mp4

Следующие 2 примера из этого поста хорошо подходят для переименования каталогов, подкаталогов и файлов.

find -name "* *" -type d | rename 's/ /_/g'    # do the directories first
find -name "* *" -type f | rename 's/ /_/g'

Это позволяет обрабатывать несколько слоев файлов и каталогов в одной границе

find . -depth -name "* *" -execdir rename 's/_/-/g' "{}" \; 

Я попытался несколько версий заменить или удалить определенные символы.

Заменить точки и заменить подчеркивание

for f in *; do fn=`echo $f | sed 's/\(.*\)\.\([^.]*\)$/\1\n\2/;s/\./-/g;s/\n/./g'`; mv $f $fn; done

Ниже будут удалены скобки и скобки

rename 's/\[//g' * ; rename 's/\]//g' *
rename 's/\(//g' * ; rename 's/\)//g' *

1 ответ

Исходная ситуация:

$ find .
.
./foo---foo...foo
./foo---foo...foo/foo...foo...foo
./foo---foo...foo/foo...foo...foo/file..name...name.extension
./foo---foo...foo/foo-+-+-+-+-+X
./foo---foo...foo/foo-+-+-+-+-+X/07. Testing.mov
./foo---foo...foo/foo------------foo
./foo---foo...foo/foo------------foo/01. Introduction.mov

Теперь выполните:

$ find . -depth -execdir rename -E 's%^./%%' -E "s/[-_\.+\"'\?]{2,}/-/g" {} \;
./07. Testing.mov not renamed: 07. Testing.mov already exists
./01. Introduction.mov not renamed: 01. Introduction.mov already exists
./. not renamed: . already exists

Результат:

$ find .
.
./foo-foo-foo
./foo-foo-foo/foo-foo-foo
./foo-foo-foo/foo-foo-foo/file-name-name.extension
./foo-foo-foo/foo-foo
./foo-foo-foo/foo-foo/01. Introduction.mov
./foo-foo-foo/foo-X
./foo-foo-foo/foo-X/07. Testing.mov

Ваш вопрос должен содержать примеры, подобные тем, которые я добавил с "Начальная ситуация:" и "Результат:". Только так каждый сможет понять, чего вы хотите. Без этого это просто игра в догадки.

Другие вопросы по тегам