【问题标题】:How can I rename a file on unix using characters in filename?如何使用文件名中的字符重命名 unix 上的文件?
【发布时间】:2016-02-14 03:29:15
【问题描述】:
我在 unix 目录中有一堆文件,如下所示: 文件名_1234567.txt 我需要通过复制每个文件名的最后三个字符来重命名它们 到文件名的前面,如下所示: 567_filename_1234567.txt 注意:文件名和扩展名都是可变的。 我在 Solaris 机器上运行它。 提前致谢!

【问题讨论】:

  • 你用的是什么外壳? echo $SHELL
  • 我正在使用 ksh 在命令行中对其进行测试,但计划将其作为 bash 脚本的一部分运行。
  • 您需要使用您打算用于生产的相同 shell 进行测试!

标签: unix filenames rename


【解决方案1】:

一种可能性:

\ls *.txt | sed 's/\(.*\)\(...\).txt/mv \1\2.txt \2_\1.txt/' | sh

(用echo mv 写这句话可能是明智的,而您正在仔细检查它是否符合您的想法)。

我无法决定是否可以选择

sed 's/\(\(.*\)\(...\).txt\)/mv \1 \3_\2.txt/'

更健壮,或者只是太挑剔了。

【讨论】:

  • 这行得通:\ls .txt | sed 's/(.*)(...).txt/mv \1\2.txt \2_\1.txt/' | sh 如果扩展名是可变的,它会如何工作 --> ls *. ?
【解决方案2】:
#for file in *_*.*
for file in `ls *_*.txt`
do
   last_3="$(echo $file | grep -o "...\...."|cut -d'.' -f1)"
   cp $file ${last_3}_${file}
done

【讨论】:

  • for file in *_*.txt 有什么问题?不要解析ls的输出;它一定会给你带来麻烦......
  • 我同意,但由于他是新人,这对他来说是一个暗示,因为他可以探索更多。感谢您指出
  • 特别是“因为他是新人”,建议最好的脚本实践,而不是糟糕的......
  • 运行for循环并收到:“grep:非法选项--o用法:grep -hblcnsviw模式文件......”注意:在 Solaris 机器上运行。
  • @BlairCombs 我明白了。你的 solaris 盒子有 /usr/local/gnu/bin/grep (GNU grep) 吗?
猜你喜欢
  • 2013-12-18
  • 2020-12-01
  • 2015-07-19
  • 1970-01-01
  • 2012-05-28
  • 2018-05-31
  • 2017-10-11
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多