我有一个包含20个文件的列表,其中10个已经在名称开头有1970-01-01-01-,10个没有(其余的都以小写字母开头(。
所以我的任务是将那些开头没有纪元日期的文件也重命名为纪元日期。使用 bash,下面的代码可以工作,但我无法使用正则表达式(例如使用重命名(来解决它。我不得不提取基本名称,然后进一步提取 mv。一个优雅的解决方案是只使用一根管子而不是两根管子。
工程
find ./ -regex './[a-z].*' | xargs -I {} basename {} | xargs -I {} mv {} 1970-01-01-{}
因此,正在寻找仅使用一个 xargs 或 -exec 的解决方案?
您可以使用单个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-/' {} +
我总是更喜欢可读代码而不是短代码。
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 {}' ;
这也只是打印出本来会做的事情(用于测试(。 在mv
之前取下echo
,才能变成真实的东西。
请注意,mv
将覆盖现有文件(如果已经有 ./a/b/c 和 ./a/b/1970-01-01-c(。 使用选项 -i
mv
从中保存。