Как заменить последовательные символы от имен каталогов, рекурсивно

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

AS, предложенный @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

кому:

expected_results . ├── 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' *
0
задан 20 January 2019 в 14:20

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

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

1
ответ дан 26 October 2019 в 12:28

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

Похожие вопросы: