如何从目录/文件名中批量删除某些字符

如何从目录/文件名中批量删除某些字符

我可以使用什么命令在 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!)

这不是一个非常优雅的解决方案,但它确实有效。一切都是不言自明的,除了-execwhich可能是一个选项,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/)

相关内容