使用xargs,eval和mv ensemble

时间:2016-06-16 20:30:03

标签: regex bash perl pcre

我最近更频繁地使用命令行来提高我的熟练程度。我已经创建了一个.txt文件,其中包含我要下载的库的URL。我使用

批量下载这些文件
$ cat downloads.txt | xargs wget

使用wget命令时,我没有指定目标目录。我想将我刚刚下载的每个文件移动到名为“vendor”的目录中。

为了记录,我发现如果我跑...

$ open .

...我可以将这些文件拖放到所需的目录中。但在我看来,这会破坏这项工作的目的。

现在我的cwd中有文件,我希望能够定位它们并将它们移到“供应商”目录中。

作为一个侧面问题:是否有一种有用的方法可以将最近创建的文件打印到STDOUT?目前,我可以使用以下管道和Perl脚本从downloads.txt中的URL中获取文件名...

$ cat downloads.txt | perl -n -e 'if (/(?<=\/)([-.a-z]+)$/) { print $1 . "\n" }'

这会产生......

react.js
redux.js
react-dom.js
expect.js

...这很棒,因为这些是我打算定位的文件。我想将这些行中的每一行转换为类似于此的管道中的命令......

$ mv {./,./vendor/}<filename>

...其中<filename>是“react.js”然后是“redux.js”,依此类推。

我认为我可以使用xargsevalmv的某种组合来完成此操作。这就是我的bash技能下降的地方。

重申一下,我知道我接近这个问题的方法既不简单也不理想。这故意是一种复杂的练习,旨在扩展我的bash知识。

是否有人知道我如何使用xargsevalmv来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:0)

 xargs -l -a downloads.txt basename | xargs -i mv {}  ./vendor

如何工作:xargs的第一个实例从downloads.txt读取文件名,并分别为每个文件名调用basename(或者,您可以使用basename -a })。然后将这些基本名称传送到另一个xargs实例,该实例使用参数调用mv,用当前参数替换字符串{}

mv $(basename -a $(<downloads.txt)) ./vendor

如何工作:由于您要将所有文件移动到同一目录中,因此您可以使用mv一次调用。命令替换(“反引号”)插入命令basename -a的输出,然后命令从文件中读取其参数。