【发布时间】:2016-12-29 20:20:47
【问题描述】:
我有一个目录,其中一些文件必须重命名:
alabama.txt california1.txt california2.txt california3.txt florida.txt
californiaX.txt 文件应重命名为 cX.txt,X 是一个数字。
这是我尝试过的:
ls | sed 's/california/c/'
但这不能存储结果。阅读其他一些帖子,我尝试添加sh,但它显示“找不到命令”。
ls | sed 's/california/c/' | sh
rename 命令也不起作用(我在 Mac 上)。
mv 命令仅适用于文件。所以我尝试了一个循环,同样,它不起作用:
for file in california*; do mv file c*; done
欢迎任何关于我做错了什么的信息。
【问题讨论】:
-
在不完全理解它们的作用的情况下在终端上随意输入命令是很危险的!例如
ls | ... | sh是,嗯,可能有害! -
不要相信互联网!我的意思是你可能正在执行任意命令......你可能已经执行了会擦除你的主目录的命令。您的链接显示了一些相当糟糕的做法!并不是因为它在 SO 上并且有高票数才好。
-
令人毛骨悚然的是,任何人都可以随意复制和粘贴代码而不了解其含义......
-
现在,如果您想知道将 data 传递到
sh的策略有什么问题:在 一个新的空目录中, 创建一个名为californialear的文件并运行您的命令:ls | sed 's/california/c/' | sh。恭喜,您刚刚执行了命令clear。我本可以像这样执行任何其他命令,甚至是具有潜在危险的命令!使用eval管道通过外壳同样糟糕。你学到了什么吗? -
| sh只是提供所有内容供 shellsh执行! 要重命名文件,请使用for循环,如此处的答案所示。这真是地道的方式!
标签: bash