我有一个包含20个文件的列表,其中10个已经有1970-01-01-在名称的开头,10个没有(其余的都以小写字母开头)。
所以我的任务是重命名那些在纪元日期开始时没有纪元日期的文件。使用bash,下面的代码可以工作,但我无法使用正则表达式解决它,例如使用重命名。我不得不提取基本名称,然后进一步提取mv。一个优雅的解决方案是使用一个管道而不是两个。
作品
find ./ -regex './[a-z].*' | xargs -I {} basename {} | xargs -I {} mv {} 1970-01-01-{}
因此寻找只有一个xargs或-exec的解决方案?
答案 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)。使用选项-i
与mv
保存即可。