Bash Shell awk/xargs 魔法

问题描述 投票:0回答:4

我正在尝试学习一点 awk foo。我有一个 CSV,其中每行的格式为partial_file_name,file_path。我的目标是找到文件(基于部分名称)并将它们移动到各自的新路径。我想结合 find、awk 和 mv 的力量来实现这一目标,但我一直在实施。我想使用 awk 将术语与 csv 文件分开,以便我可以执行类似
的操作

find . -name '*$1*' -print | xargs mv {} $2{}

其中 $1 和 $2 是 csv 文件中的拆分项。大家有什么想法吗?
-和平

bash awk xargs
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/

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

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

完成。


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


0
投票

使用awk的系统命令怎么样:

awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'

csv 文件中的示例参数:test.txt ./subdirectory/


0
投票
find . -name "*err" -size "+10c" | awk -F.err '{print $1".job"}' | xargs -I {} qsub {}
© www.soinside.com 2019 - 2024. All rights reserved.