我正在尝试学习一点 awk foo。我有一个 CSV,其中每一行的格式为 partial_file_name,file_path。我的目标是找到文件(基于部分名称)并将它们移动到各自的新路径。我想结合 find、awk 和 mv 的力量来实现这一点,但我坚持执行。我想使用 awk 将条款与 csv 文件分开,这样我就可以做一些事情,比如
find . -name '*$1*' -print | xargs mv {} $2{}
$1 和 $2 是 csv 文件中的拆分条款。有人有想法么?
-和平
问问题
25966 次
4 回答
6
我想你把事情搞混了。{}
只能在 find 中使用,并且只能使用一次。即你不能做类似的事情find -name '*.jpg' -exec mv {} {}.png
。
做这个:
$ cat korv
foo.txt,/hello/
bar.jpg,/mullo/
$ awk -F, '{print $1 " " $2}' korv
foo.txt /hello/
bar.jpg /mullo/
-F 设置分隔符,因此上面将使用“,”进行拆分。接下来,将 * 添加到文件名:
$ 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/
看起来不错,所以使用 subshell 将所有这些封装到 mv 中:
$ mv $(awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv)
$
完毕。
于 2011-11-11T06:13:12.457 回答
1
你真的不需要 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
.
于 2011-11-11T13:48:37.890 回答
0
使用 awk 的系统命令怎么样:
awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'
csv 文件中的示例参数:test.txt ./subdirectory/
于 2011-11-11T05:53:31.497 回答
0
find . -name "*err" -size "+10c" | awk -F.err '{print $1".job"}' | xargs -I {} qsub {}
于 2016-11-11T21:51:18.947 回答