Bash Shell awk/xargs magic



我想学一点awk foo。我有一个CSV文件,其中每行的格式为partial_file_name,file_path。我的目标是找到文件(基于部分名称)并将它们移动到各自的新路径。我想结合find,awk和mv的力量来实现这一目标,但我在执行过程中遇到了困难。我想用awk将术语从csv文件中分离出来这样我就可以做一些像
这样的事情find . -name '*$1*' -print | xargs mv {} $2{}
其中$1和$2是来自CSV文件的拆分项。有人有什么想法吗?
和平

我建议这样做:
$ cat korv
foo.txt,/hello/
bar.jpg,/mullo/
$ awk -F, '{print $1 " " $2}' korv
foo.txt /hello/
bar.jpg /mullo/

-F设置分隔符,因此上面将使用"&quot分隔。接下来,在文件名中添加*:

$ awk -F, '{print "*"$1"*" " " $2}' korv
*foo.txt* /hello/
*bar.jpg* /mullo/
**

这表明我有一个空行。我们不希望这个匹配,所以我们添加了一个规则:

$ awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv
*foo.txt* /hello/
*bar.jpg* /mullo/

看起来不错,所以使用子shell将所有这些封装到mv中:

$ mv $(awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv)
$

您实际上不需要awk。没有什么地方awk比shell做得更好。

#!/bin/sh
IFS=,
while read file target; do
  find . -name "$file" -print0 | xargs -ir0 mv {} "$target"
done <path_to_csv_file

如果文件名中有特殊字符,则可能需要调整read

如何使用awk的系统命令:

awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'
CSV文件中的示例参数:test.txt ./子目录/
find . -name "*err" -size "+10c" | awk -F.err '{print $1".job"}' | xargs -I {} qsub {}

最新更新