这个脚本如何用 awk one-liner 来完成?

这个脚本如何用 awk one-liner 来完成?

我想替换目录中所有文件的文件名中的多个空白。所以我想创建一个重命名脚本。

我已经完成了这个 bash 脚本,想问一下这是否可以用 awk 单行或更复杂的方式完成。

#!/bin/bash
find $1 -name '*  *.*' -print > l1 
sed -i -e 's/^\|$/"/g'  l1
sed -e 's/  / /g' l1 >  l2 
sed -i -e 's/^/mv /g'   l1
pr -Tm l[12]

我已经用 awk 尝试过,但确实得到了错误的输出。

#!/bin/bash
find $1 -name '*  *.*' -print > l1 
sed -i -e 's/^\|$/"/g'  l1
sed -e 's/  / /g' l1 >  l2 
awk -v FS=';' 'NR==FNR{  s[$1]=$0; next } END {print "mv "$0" "s[$1];}' l1 l2 

我的错误输出只是mvl2 中的 和 行。

有人可以帮我找到错误吗 - 我做错了什么?谢谢

答案1

您是否只是想重命名文件以将其名称中的所有空格链压缩为 1?那是(未经测试):

#!/usr/bin/env bash

shopt -s extglob
while IFS= read -rd '' old; do
    new="${old// *( )/ }"
    mv -- "$old" "$new"
done < <(find "$1" -name '*  *.*' -print0)

没有理由涉及 awk 或其他命令。

答案2

我找到了:这里

    awk -v FS=' ' 'NR==FNR{  s[$1]=$0; next }  {print "mv "s[$1]" " $0}' l1 l2 

相关内容