How to replace consecutive characters from directory names, recursively
Каков наилучший способ заменить все последовательные символы, такие как _+-."'?
из каталога и всех имен подкаталогов с помощью GNU bash
, версия 4.3, с использованием инструментов awk
, sed
Perl 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
Ваш вопрос должен содержать примеры, подобные тем, которые я добавил с "Начальная ситуация:" и "Результат:". Только так каждый сможет понять, чего вы хотите. Без этого это просто игра в догадки.