![如何递归地替换目录名称中的连续字符](https://linux22.com/image/1162776/%E5%A6%82%E4%BD%95%E9%80%92%E5%BD%92%E5%9C%B0%E6%9B%BF%E6%8D%A2%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%E4%B8%AD%E7%9A%84%E8%BF%9E%E7%BB%AD%E5%AD%97%E7%AC%A6.png)
最好的办法是什么来取代所有连续字符例如_+-."'?
从目录和所有子目录的名称使用 GNU bash
,版本 4.3,使用工具awk
,,sed
Perlrename
或find
?
正如@Ralf 所建议的那样:
例如,重命名目录
初始状况
. ├── 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
你的问题确实应该包含像我添加的“初始情况:”和“结果:”这样的示例。只有这样,任何人都能理解你想要什么。没有它,它只是猜谜游戏。