我想替换目录中所有文件的文件名中的多个空白。所以我想创建一个重命名脚本。
我已经完成了这个 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
我的错误输出只是mv
l2 中的 和 行。
有人可以帮我找到错误吗 - 我做错了什么?谢谢
答案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