如何替换目录中所有文件名中的字符串? (特别是我需要从目录中的所有文件名中删除“\#015”

Posted

技术标签:

【中文标题】如何替换目录中所有文件名中的字符串? (特别是我需要从目录中的所有文件名中删除“\\#015”【英文标题】:How can I replace a string in all filenames in a directory? (specifically I need to remove "\#015" from all file names in a directory如何替换目录中所有文件名中的字符串? (特别是我需要从目录中的所有文件名中删除“\#015” 【发布时间】:2012-11-05 09:52:37 【问题描述】:

目录 (/root/path/) 中的许多文件都附加了一个奇怪的字符串 (\#015)。帮我用没有奇怪字符串的常规名称替换它们。

我需要:

/root/path/img1.png\#015
/root/path/img2.jpg
/root/path/img3.png\#015

成为:

/root/path/img1.png
/root/path/img2.jpg
/root/path/img3.png

你能帮忙吗?

【问题讨论】:

我的问题已通过在失败的rsync bash 脚本中将行尾 (EOL) 从 Windows 转换为 Unix 得到解决 - 评论是因为此答案是搜索中出现的第一件事。跨度> 【参考方案1】:
for file in *\#015
do
   mv -- "$file" "$file%\#015"
done

您可能需要转义“\”。先在 tmp 目录下试一下。

【讨论】:

【参考方案2】:

如果您安装了rename,这将成为一项相当简单的任务:

rename 's/\\#015$//' /root/path/*\\#015

如有必要,您可以添加-f 标志以强制覆盖现有文件。

【讨论】:

【参考方案3】:

这就是我过去用一个小外壳解决类似问题的方法。

cd /root/path/
ls | grep '\#015' | sed 's/\(.*\)\\#015/mv & \1/' | sh

【讨论】:

当然,Ryan,你会去掉尾随的| sh,这样你就可以查看“将要执行”的命令,直到你确定这些命令不会产生意想不到的后果, 正确的? ;-) 祝大家好运。 而不是ls | grep '\#015',使用ls *\#015 会更自然。无论如何我都不会使用这种方法,因为你只需要一个简单的 shell 循环。【参考方案4】:

您可以使用find 和参数替换来做到这一点,如下所示:

#!/bin/bash

find -name '*\\#015' | while IFS= read -r f
do
    mv -- "$f" "$f%?????"
done
将上面的代码放在你的/root/path/中一个名为my_script.sh的脚本中,并由chmod +x my_script.sh && ./my_script.sh运行 请注意,这会将更改递归地应用到/root/path/ 下的所有子文件夹。

说明:

find -name '*\\#015':查找所有以\#015结尾的文件 然后对于找到的每个此类文件:mv "$f" "$f%?????" 将其从旧名称重命名为新名称,并删除文件名中的最后 5 个字符。

【讨论】:

请记住引用您的变量,除非您有非常具体的理由不这样做。如果您的文件名包含空格或任何通配符或以 - 符号开头,则上述操作将失败。 @EdMorton 好电话。现在编辑。 mv 之后添加--。更重要的是,您的循环不会像所写的那样工作。你需要写成find -name '*\\#015' | while IFS= read -r file 澄清一下,你不能做for f in $files,否则对于包含空格和做通配符的文件名会失败,但你也不能做for f in "$files",否则所有文件名将被连接成一个细绳。因此需要将 find 输出通过管道传输到 while read 循环。对于包含换行符的文件名,它仍然会失败,您需要使用 xargs 或 find -exec 来解决这个问题,但这一切都可能变得不必要地复杂。 for file in * 是最好的选择,因为它清晰、简单且万无一失。 @EdMorton 感谢您指出这一点。你能详细说明一下while IFS= read -r file吗?我假设将内部字段分隔符设置为“”? (但默认情况下不是 IFS 空间吗?)另外,您可以指出我阅读read 的资源吗?我试着看,但结果却被系统调用饱和了。

以上是关于如何替换目录中所有文件名中的字符串? (特别是我需要从目录中的所有文件名中删除“\#015”的主要内容,如果未能解决你的问题,请参考以下文章

如果匹配 FLUTTER 中的特定字符,则替换字符串中的字符

linux替换目录下所有文件中的某字符串

python如何去掉字符串中的斜杠

如何打开目录中的所有文件并将更改保存在同一文件中? [关闭]

如何使用 Perl 进行批量搜索和替换?

用c#中列表中的连续元素替换字符串占位符