Что лучший способ состоит в том, чтобы заменить все последовательные символы такой как _+-."'?
из каталога и имен всего подкаталога с помощью 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' *
Начальная ситуация:
$ 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
Ваш вопрос должен действительно содержать примеры как, я добавил с "Начальной ситуацией": и "Результат":. только тот способ, которым любой может понять то, что Вы хотите. Без него он просто предполагает игру.