【问题标题】:Rename many files in command line with condition使用条件重命名命令行中的许多文件
【发布时间】:2016-12-29 20:20:47
【问题描述】:

我有一个目录,其中一些文件必须重命名:

alabama.txt   california1.txt   california2.txt   california3.txt   florida.txt

californiaX.txt 文件应重命名为 cX.txtX 是一个数字。

这是我尝试过的:

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 只是提供所有内容供 shell sh 执行! 要重命名文件,请使用for 循环,如此处的答案所示。这真是地道的方式!

标签: bash


【解决方案1】:

一个变量,当被引用时应该以 $ 开头(声明时,它不是)。而且,您应该将参数替换为“文件”变量:

for file in california*; do mv "$file" "${file/california/c}"; done

【讨论】:

  • 上面写着usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory
  • 我用参数替换编辑了答案,你能再试一次吗?
  • 顺便说一句,我认为这个问题更适合unix.stackexchange.com。
  • 好的,谢谢,现在可以了。好的,不知道unix stackexchange论坛,下次会考虑的。
  • 谢谢@gniourf_gniourf,我认为这是为了处理文件名中任何可能的空格?
【解决方案2】:

要重命名文件,您需要:1. 旧名称,2. 新名称。

您尝试获取旧名称或新名称。没有人会尝试同时找到两者。

以下是将您的尝试组合成一个可行的解决方案:

for file in california*
do
  newname=$(echo "$file" | sed 's/california/c/')
  mv "$file" "$newname"
done

这可以更规范地写成内联参数扩展:

for file in california*
do
  mv "$file" "c${file#california}"
done

【讨论】:

  • 如果不是因为echo|sed 的恐怖,我很乐意投票。
【解决方案3】:

使用mvbash substring-extraction 作为

for file in california*.txt
do
    mv -v -- "$file" "${file:0:1}${file:10:1}.${file#*.}"
done

这里,-- 是一个内置的bash,表示命令选项的结束,之后只接受位置参数,不再接受命令标志。而子串提取部分是

${string:position} 和 ${string:position:length}

“string”指定我们的变量名,“position”是我们从中提取信息的起点。我们可以通过使用“length”参数进一步微调它。当长度与位置一起使用时,这意味着从位置 x 开始显示信息,长度为 y。

【讨论】:

  • @Tana:这样会更好吗?
猜你喜欢
  • 2016-05-29
  • 2012-12-28
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2015-07-19
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多