在bash中的文件开头附加纪元日期

时间:2018-01-03 14:53:10

标签: regex bash

我有一个包含20个文件的列表,其中10个已经有1970-01-01-在名称的开头,10个没有(其余的都以小写字母开头)。

所以我的任务是重命名那些在纪元日期开始时没有纪元日期的文件。使用bash,下面的代码可以工作,但我无法使用正则表达式解决它,例如使用重命名。我不得不提取基本名称,然后进一步提取mv。一个优雅的解决方案是使用一个管道而不是两个。

作品

find ./ -regex './[a-z].*' | xargs -I {}  basename {} | xargs -I {} mv {} 1970-01-01-{}

因此寻找只有一个xargs或-exec的解决方案?

2 个答案:

答案 0 :(得分:2)

您只需使用一个rename命令:

rename -n 's/^([a-z])/1970-01-01-$1/' *

假设您正在操作当前目录中的所有文件。

请注意-n标志(空运行)仅显示rename命令的预期操作,但不会真正重命名任何文件。

如果您想与find合并,请使用:

find . -type f -maxdepth 1 -name '[a-z]*.txt' -execdir rename -n 's/^/1970-01-01-/' {} +

答案 1 :(得分:0)

我总是喜欢可读代码而不是短代码。

r() {
  base=$(basename "$1")
  dir=$(dirname "$1")
  if [[ "$base" =~ ^1970-01-01- ]]
  then
    : "ignore, already has correct prefix"
  else
    echo mv "$1" "$dir/1970-01-01-$base"
  fi
}
export -f r

find . -type f -exec bash -c 'r {}' \;

这也打印出了已经完成的工作(用于测试)。删除echo之前的mv以获得真实内容。

请注意mv将覆盖现有文件(如果已经有./a/b/c和./a/b/1970-01-01-c)。使用选项-imv保存即可。