gpt4 book ai didi

linux - "find"和 "ls"与 GNU 并行

转载 作者:IT王子 更新时间:2023-10-29 00:00:08 27 4
gpt4 key购买 nike

我正在尝试使用 GNU parallel 将大量文件发布到网络服务器。在我的目录中,我有一些文件:

file1.xml
file2.xml

我有一个如下所示的 shell 脚本:

#! /usr/bin/env bash

CMD="curl -X POST -d@$1 http://server/path"

eval $CMD

脚本中还有一些其他内容,但这是最简单的示例。我尝试执行以下命令:

ls | parallel -j2 script.sh {}

这就是 GNU parallel 页面显示的对目录中的文件进行操作的“正常”方式。这似乎将文件名传递到我的脚本中,但 curl 提示它无法加载传入的数据文件。但是,如果我这样做:

find . -name '*.xml' | parallel -j2 script.sh {}

它工作正常。 lsfind 将参数传递给我的脚本的方式有区别吗?或者我需要在该脚本中做一些额外的事情吗?

最佳答案

GNU parallelxargs 的变体。它们都有非常相似的界面,如果您正在寻找有关 parallel 的帮助,您可能会更幸运地查找有关 xargs 的信息。

话虽如此,它们的操作方式都相当简单。使用它们的默认行为,两个程序都从 STDIN 读取输入,然后根据空格将输入分解为标记。然后将这些标记中的每一个作为参数传递给提供的程序。 xargs 的默认设置是将尽可能多的标记传递给程序,然后在达到限制时启动一个新进程。我不确定并行的默认设置是如何工作的。

这是一个例子:

> echo "foo    bar \
baz" | xargs echo
foo bar baz

默认行为存在一些问题,因此经常会看到多种变体。

第一个问题是,因为空格用于标记化,所以任何包含空格的文件都会导致 parallel 和 xargs 中断。一种解决方案是围绕 NULL 字符标记化。 find 甚至提供了一个选项来简化此操作:

> echo "Success!" > bad\ filename
> find . "bad\ filename" -print0 | xargs -0 cat
Success!

-print0 选项告诉 find 使用 NULL 字符而不是空格来分隔文件。
-0 选项告诉 xargs 使用 NULL 字符来标记每个参数。

请注意,parallelxargs 好一点,因为它的默认行为是仅围绕换行符进行标记化,因此无需更改默认行为.

另一个常见问题是,您可能希望控制将参数传递给 xargsparallel 的方式。如果您需要将传递给程序的参数放置在特定位置,您可以使用 {} 指定放置参数的位置。

> mkdir new_dir
> find -name *.xml | xargs mv {} new_dir

这会将当前目录和子目录中的所有文件移动到 new_dir 目录中。它实际上分为以下几种:

> find -name *.xml | xargs echo mv {} new_dir
> mv foo.xml new_dir
> mv bar.xml new_dir
> mv baz.xml new_dir

因此,考虑到 xargsparallel 的工作方式,您应该能够看到命令的问题。 找到。 -name '*.xml' 将生成要传递给 script.sh 程序的 xml 文件列表。

> find . -name '*.xml' | parallel -j2 echo script.sh {}
> script.sh foo.xml
> script.sh bar.xml
> script.sh baz.xml

但是,ls | parallel -j2 script.sh {} 将生成当前目录中要传递给 script.sh 程序的所有文件的列表。

> ls | parallel -j2 echo script.sh {}
> script.sh some_directory
> script.sh some_file
> script.sh foo.xml
> ...

ls 版本的更正确的变体如下:

> ls *.xml | parallel -j2 script.sh {}

然而,这个版本与 find 版本的重要区别在于 find 将在所有子目录中搜索文件,而 ls 将仅搜索当前目录。上述 ls 命令的等效 find 版本如下:

> find -maxdepth 1 -name '*.xml'

这只会搜索当前目录。

关于linux - "find"和 "ls"与 GNU 并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7610507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com