如何替换目录中所有文件名中的字符串? (特别是我需要从目录中的所有文件名中删除“\#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 中的特定字符,则替换字符串中的字符