标签: xargs

将现有数组中的所有元素传递给xargs

我试图传递一个文件路径数组,xargs将它们全部移动到一个新的位置.我的脚本目前的工作方式如下:

FILES=( /path/to/files/*identifier* )
if [ -f ${FILES[0]} ]
  then
    mv ${FILES[@]} /path/to/destination
fi
Run Code Online (Sandbox Code Playgroud)

将FILES作为数组的原因是因为if [ -f /path/to/files/*identifier* ]如果通配符搜索返回多个文件,则失败.仅检查第一个文件,因为如果存在任何文件,将执行移动.

我想,以取代mv ${FILES[@]} /path/to/destination与传递线路${FILES[@]}xargs移动的每个文件.我需要使用,xargs因为我希望有足够的文件来重载单个mv.通过研究,我只能找到移动文件的方法,我已经知道哪些文件再次搜索文件.

#Method 1
ls /path/to/files/*identifier* | xargs -i mv '{}' /path/to/destination

#Method 2
find /path/to/files/*identifier* | xargs -i mv '{}' /path/to/destination
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将现有数组中的所有元素传递${FILES[@]}xargs

以下是我尝试过的方法及其错误.

尝试1:

echo ${FILES[@]} | xargs -i mv '{}' /path/to/destination
Run Code Online (Sandbox Code Playgroud)

错误:

mv: cannot stat `/path/to/files/file1.zip /path/to/files/file2.zip /path/to/files/file3.zip /path/to/files/file4.zip': …
Run Code Online (Sandbox Code Playgroud)

unix linux bash terminal xargs

13
推荐指数
1
解决办法
7467
查看次数

将xargs生成的命令发送到后台

我想知道如何将xargs生成的命令发送到后台.例如,考虑一下

find . -type f  -mtime +7 | tee compressedP.list | xargs compress
Run Code Online (Sandbox Code Playgroud)

我试过了

find . -type f  -mtime +7 | tee compressedP.list | xargs -i{} compress {} &
Run Code Online (Sandbox Code Playgroud)

..并且出乎意料的是,它似乎将xargs发送到后台了?

如何使compress命令的每个实例都转到后台?

unix background xargs

12
推荐指数
3
解决办法
4920
查看次数

Shell Scripting:使用xargs执行shell函数的并行实例

我试图使用xargs的在shell脚本来运行我在同一个脚本中定义一个函数的并行实例.该函数次页面的抓取,所以很重要的是,网页实际上是在并行处理同时获取,而不是在后台进程(如果我的这种认识是错误的,还有两者之间的微小差别,只是让我知道) .

功能是:

function time_a_url ()
{
     oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2)
     echo "Fetching $1 took $oneurltime seconds."
}
Run Code Online (Sandbox Code Playgroud)

怎样才能用,可以采取的次数并行运行time_a_url作为自变量的形式xargs的管做到这一点?是的,我知道GNU平行的,我只是没有安装在那里我写这个软件的特权.

bash shell xargs

12
推荐指数
1
解决办法
8957
查看次数

如果xargs是map,那么什么是过滤器?

我认为是xargsUNIX shell的map函数.功能是什么filter

编辑:看起来我必须更明确一点.

假设我必须提交一个接受单个字符串作为参数的程序,并返回退出代码0或1.该程序将作为它接受的字符串的谓词.

例如,我可能决定将字符串参数解释为文件路径,并将谓词定义为"此文件是否存在".在这种情况下,程序可以是test -f,给定一个字符串,如果文件存在则退出0,否则退出1.

我还必须交出一串串.例如,我可能有一个~/paths包含的文件

/etc/apache2/apache2.conf
/foo/bar/baz
/etc/hosts
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个新文件,~/existing_paths只包含我文件系统中存在的那些路径.就我而言,那就是

/etc/apache2/apache2.conf
/etc/hosts
Run Code Online (Sandbox Code Playgroud)

我想通过读取~/paths文件,通过谓词过滤这些行test -f,并将输出写入来完成此操作~/existing_paths.通过类比xargs,这看起来像:

cat ~/paths | xfilter test -f > ~/existing_paths
Run Code Online (Sandbox Code Playgroud)

这是xfilter我正在寻找的假设程序:

xfilter COMMAND [ARG]...
Run Code Online (Sandbox Code Playgroud)

对于L其标准输入的每一行,将调用COMMAND [ARG]... L,如果退出代码为0,则打印L,否则不打印任何内容.

要明确,我不是在寻找:

  • 一种过滤存在的文件路径列表的方法.这是一个具体的例子.
  • 怎么写这样的程序.我能做到.

正在寻找:

  • 一个预先存在的实现,比如xargs,或
  • 明确解释为什么不存在这一点

shell map filter xargs

12
推荐指数
3
解决办法
1862
查看次数

Shell脚本:将bash与xargs一起使用

我正在尝试编写一个bash命令,它将删除与特定模式匹配的所有文件 - 在这种情况下,它是所有已构建的旧vmware日志文件.

我试过这个命令:

find . -name vmware-*.log | xargs rm
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该命令时,它会阻塞其名称中包含空格的所有文件夹.有没有办法格式化文件路径,以便xargs将其传递给rm引用或正确转义?

bash shell find xargs

11
推荐指数
3
解决办法
2万
查看次数

xargs jar tvf - 不起作用

目标:列出所有罐子中的文件.

这有效:

for f in `find . -name "*.jar"`; do jar tvf $f; done
Run Code Online (Sandbox Code Playgroud)

这也有效:

find . -name "*.jar" -exec jar tvf {} \;
Run Code Online (Sandbox Code Playgroud)

这不(它不打印任何输出):

find . -name "*.jar" | xargs jar tvf
Run Code Online (Sandbox Code Playgroud)

为什么后者不起作用?

bash xargs

11
推荐指数
3
解决办法
3053
查看次数

xargs - 如果条件和echo {}

我有一些包含特定字符串的文件.我想要做的是,搜索文件的位置; 如果文件存在grep的模式; 如果是真的,做点什么.

find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi
Run Code Online (Sandbox Code Playgroud)

问题是:

  • xargs 不使用if语句.
  • echo {}不给出文件名,而是给出{}.

我该如何解决这些问题?

unix bash if-statement xargs echo

11
推荐指数
2
解决办法
2万
查看次数

找到xargs和tar

我有以下我想做的事情:
find . -maxdepth 6 ( -name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra ) -prune -o -print| tar cvf somefile.tar --files-from=-
即排除很多东西,只看6个深度的子目录,然后一旦修剪完毕,将其余部分用完.

不难.管道(|)之前的位工作100%.如果我排除了焦油,那么我就会得到我所追求的(到屏幕上).但是,一旦我包含了管道和焦油,它就会包含所有东西,包括我刚刚在查找中排除的所有东西.

我尝试了许多不同的迭代:
-print0 | xargs -0 tar rvf somefile.tar
-print0 | xargs -0 tar rvf somefile.tar --null --files-from = -
-print0 | tar cvf somefile.tar --null -T -

那么我做错了什么?我以前做过这个; 但现在它只是给了我白发.

tar find xargs

11
推荐指数
2
解决办法
2万
查看次数

一次循环多个项目

我们可以迭代一组项目,一次考虑一个,如下所示:

#!/bin/bash
for i in $( ls ); do
    echo item: $i
done
Run Code Online (Sandbox Code Playgroud)

我们如何在类似的循环中一次处理几个项目?就像是:

#!/bin/bash
for i,j,k in $( ls ); do
    echo item i: $i
    echo item j: $j
    echo item k: $k
done
Run Code Online (Sandbox Code Playgroud)

第二个shell脚本不正确,但应准确说明我想要实现的目标.

unix bash shell xargs

11
推荐指数
1
解决办法
1769
查看次数

如何在没有参数列表太长的情况下移动多个文件?

我试图在我的Ubuntu服务器中将大约700,000个.jpg文件从一个目录移动到另一个目录.我尝试了以下方法:

xargs mv *  -t /var/www/html/
Run Code Online (Sandbox Code Playgroud)

echo (*.jpg|*.png|*.bmp) | xargs mv -t /var/www/html/
Run Code Online (Sandbox Code Playgroud)

echo (*.jpg) | xargs mv -t /var/www/html/
Run Code Online (Sandbox Code Playgroud)

find . -name "*.jpg" -print0 | xargs mv * ../
Run Code Online (Sandbox Code Playgroud)

它们都给我同样的错误:/ usr/bin/xargs:参数列表太长了

我该怎么办?请帮帮我.谢谢 :)

linux ubuntu xargs mv

11
推荐指数
2
解决办法
2万
查看次数

标签 统计

xargs ×10

bash ×6

shell ×4

unix ×4

find ×2

linux ×2

background ×1

echo ×1

filter ×1

if-statement ×1

map ×1

mv ×1

tar ×1

terminal ×1

ubuntu ×1