我试图传递一个文件路径数组,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) 我想知道如何将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命令的每个实例都转到后台?
我试图使用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平行的,我只是没有安装在那里我写这个软件的特权.
我认为是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,或我正在尝试编写一个bash命令,它将删除与特定模式匹配的所有文件 - 在这种情况下,它是所有已构建的旧vmware日志文件.
我试过这个命令:
find . -name vmware-*.log | xargs rm
Run Code Online (Sandbox Code Playgroud)
但是,当我运行该命令时,它会阻塞其名称中包含空格的所有文件夹.有没有办法格式化文件路径,以便xargs将其传递给rm引用或正确转义?
目标:列出所有罐子中的文件.
这有效:
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)
为什么后者不起作用?
我有一些包含特定字符串的文件.我想要做的是,搜索文件的位置; 如果文件存在grep的模式; 如果是真的,做点什么.
find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi
Run Code Online (Sandbox Code Playgroud)
问题是:
xargs 不使用if语句.echo {}不给出文件名,而是给出{}.我该如何解决这些问题?
我有以下我想做的事情:
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 -
那么我做错了什么?我以前做过这个; 但现在它只是给了我白发.
我们可以迭代一组项目,一次考虑一个,如下所示:
#!/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脚本不正确,但应准确说明我想要实现的目标.
我试图在我的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:参数列表太长了
我该怎么办?请帮帮我.谢谢 :)