Linux 如何调整下一个命令以更改任何字符

Linux 如何调整下一个命令以更改任何字符,linux,bash,file,Linux,Bash,File,我试图用下划线、hashtag和一堆ftp服务器难以处理的字符来重命名一大堆文件 我总是求助于与你一起做这件事 find . -depth -name '* *' \ | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" done 但我也未能通过这种方式调整tr部分来进行更改 ....tr '(' '_')" 在这里,我想改变角色 更新 正如wjandrea所指出的,我

我试图用下划线、hashtag和一堆ftp服务器难以处理的字符来重命名一大堆文件

我总是求助于与你一起做这件事

find . -depth -name '* *' \
| while IFS= read -r f ; do
    mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)"
done
但我也未能通过这种方式调整tr部分来进行更改

....tr '(' '_')"  
在这里,我想改变角色

更新 正如wjandrea所指出的,我没有更新find comand的-name参数中的定义,应该是

find . -depth -name '*(*'

要替换空格字符!,加上下划线,您可以使用:

find . -depth -name '*[ !()#]*' -exec sh -c '
  for f; do
    mv -i "$f" "$(dirname "$f")/$(basename "$f" | tr " !()#" _)"
  done
' sh {} +
如果您的查找支持与Perl重命名工具结合使用的-execdir操作:

如果输出看起来与预期一致,请删除选项-n。

您的命令tr'.'将开括号转换为下划线。没别的了

从tr手册页:

 tr [OPTION]... SET1 [SET2]

 ....  SET2  is extended to length of SET1 by repeating its last character as necessary. ....
因此,您需要指定要翻译的所有字符,例如:

tr '()#!' _

到底是什么问题?乍一看,这看起来不错。它没有替换字符,,,!对于下划线EDID,是否也更新find命令?应该找到-例如,左括号的深度-名称“**”。这个问题的顶部答案解释了如何使用tr替换所有特殊字符-这就是你要找的吗?@wjandrea,我错过了这一部分,感谢Perl技巧,我以前尝试过,但从未成功。这是我以前做过的,但没有成功,我认为ssame更新tr部件就足够了。还需要更新查找部分。这些是不相关的问题。您可以在所有文件上使用find循环,这意味着您将执行大量不必要的mv,并且您已经可以在find命令中预先选择需要更改的文件。这更多的是关于效率而不是正确性。
tr '()#!' _