我可以使用什么命令在 fedora 29 上执行此操作我需要删除 [、] 和 -。如果可能的话,删除字符。否则我很乐意将它们替换为“_”我有 2,400 多个文件和目录,其子目录的名称类似于:
TWENTY_ONE_PILOTS_-_DISCOGRAPHY_(2009-15)_CHANNEL_NEO]
我需要它能够轻松地创建目录。例如:
TWENTY_ONE_PILOTS_DISCOGRAPHY_2009_15_CHANNEL_NEO
我试过了:
find . -depth -name '*]*' -execdir bash -c 'for i; do mv "$i" "${i
│// /_}"; done' _ {} +
和
for x in *]*; do mv -- "$x" "${x//[/}"; done
安德
rename 's/\(|\[|\]|\)//g' *
答案1
您可以使用 :find . -exec sh -c './correct.sh {}' \;
!
将正确的.sh 放在启动上述命令的同一目录中:
#!/bin/bash
mv "$1" $(echo "$1" | sed 's/_-_/_/g');
(别忘了chmod +x correct.sh
!)
这不是一个非常优雅的解决方案,但它确实有效。一切都是不言自明的,除了-exec
which可能是一个选项,find
它将针对文件的每个名称执行,提到的过程(此处sh -c '...'
)并用文件名替换{}!看查找手册页了解更多信息。
如果只想重命名文件目录,请-type d
作为 find 的选项插入。当然,您可以根据需要修改 sed 以替换您想要的内容。
答案2
和zsh
:
$ autoload zmv
$ zmv -n '(**/)(*)' '$1${${${2//[^.[:alnum:]]##/_}##_#}%%_#}'
mv -- TWENTY_ONE_PILOTS_-_DISCOGRAPHY_\(2009-15\)_CHANNEL_NEO\] TWENTY_ONE_PILOTS_DISCOGRAPHY_2009_15_CHANNEL_NEO
将除 alnums 和 以外的所有字符序列转换.
为,然后在所有文件和目录中递归地_
删除前导和尾随s。_
-n
是为了试运行,高兴的时候把它去掉。
如果您只想重命名类型的文件目录,将其更改(**/)(*)
为(**/)(*)(#q/)