我正在尝试学习一些awk技巧。我的CSV文件每行都是部分文件名和文件路径的格式。我的目标是根据部分名称找到这些文件并将它们移动到相应的新路径。我想要结合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设置分隔符,因此上面的代码将使用“,”进行拆分。接下来,在文件名中添加*:
$ 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/
看起来不错,将所有内容封装到 mv 中使用子shell:
$ 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的system命令怎么样:
awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'
CSV文件中的示例参数:test.txt ./subdirectory/
awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }' path_to_csv_file
? - adbofind . -name "*err" -size "+10c" | awk -F.err '{print $1".job"}' | xargs -I {} qsub {}
xargs -i
中加上-i
。 - tripleeeecho foo | xargs -n 1 -I {} echo mv {} {}.txt
=> mv foo foo.txt - Joshua Goldberg{}
,例如find . -name file -exec mv {} {}.txt \;
是有效的。 - Milo Wielondek