在当前目录中,我想打印文件名和内容.我可以单独打印文件名或内容
find . | grep "file_for_print" | xargs echo
find . | grep "file_for_print" | xargs cat
Run Code Online (Sandbox Code Playgroud)
但我想要的是将它们打印在一起,如下所示:
file1
line1 inside file1
line2 inside file1
file2
line1 inside file2
line2 inside file2
Run Code Online (Sandbox Code Playgroud)
我读了多个命令的xargs作为参数 并尝试过
find . | grep "file_for_print" | xargs -I % sh -c 'echo; cat;'
Run Code Online (Sandbox Code Playgroud)
但不起作用.我不熟悉xargs,所以不知道究竟是什么"-I%sh -c"的意思.谁能帮助我?谢谢!
我正在尝试使用printf和seq打印以下模式:
0000
0001
0002
0003
Run Code Online (Sandbox Code Playgroud)
我的问题是我曾经使用过:
seq 0 10 | xargs printf %04d
Run Code Online (Sandbox Code Playgroud)
我的所有输出格式化为相同的行likeo:
0000000100020003
Run Code Online (Sandbox Code Playgroud)
我仍然无法使用xargs.在这种情况下如何正确使用它?
我有一个bash脚本,其函数需要与不同的参数并行运行.我需要知道是否至少有一个执行失败(返回非零) - 无论多少失败都无关紧要.
该命令接受执行的参数数组.由于高负载,我需要将并发限制为4次并发运行.我还需要在父进程(运行bash脚本的进程)中打印日志
这是我正在运行的功能:
function run_and_retry {
EXIT_STATUS=0
$COMMAND || EXIT_STATUS=$?
if [ $EXIT_STATUS -ne 0 ]; then
EXIT_STATUS=0
$COMMAND || EXIT_STATUS=$?
fi
return $EXIT_STATUS
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用GNU parallel和xargs,并遇到了两个问题.
使用xargs :(无法从中获取退出状态,当我在TravisCI中运行它时也无效)
PARAMETERS=(first-parameter second-parameter third-parameter)
export -f run_and_retry
echo "${PARAMETERS[@]}" | xargs -P 4 -n 1 -I {} bash -c "run_and_retry {}"
Run Code Online (Sandbox Code Playgroud)
使用GNU并行:
PARAMETERS=(first-parameter second-parameter third-parameter)
export -f run_and_retry
parallel -j 4 -k --lb 2 run_and_retry {} ::: echo "${PARAMETERS[@]}"
Run Code Online (Sandbox Code Playgroud) 我在.bashrc中有这个自定义函数:
function ord() {
printf '%d' "'$1"
}
Run Code Online (Sandbox Code Playgroud)
如何让这个函数与xargs一起使用?:
cat anyFile.txt | awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' | xargs -i ord {}
xargs: ord: No such file or directory
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些文件从find命令传递到交互式删除命令,这样我就可以仔细检查我要删除的文件,但是我遇到了一些麻烦.
find -name '#*#' -print0 | xargs -0 rm -i
Run Code Online (Sandbox Code Playgroud)
我以为上面会有用,但我只是得到一串 "rm: remove regular file ./some/path/#someFile.js#? rm: remove regular file ./another/path/#anotherFile#?..."
有人可以向我解释究竟发生了什么,以及我能做些什么才能得到我想要的结果?谢谢.
我做了一个启动并行rsync进程的脚本:
#! /bin/bash
LIST=$1
DEST_DIR=$2
RSYNC_OPTS=$3
#echo "rsyncing From=$SRC_DIR To=$DEST_DIR RSYNC_OPTS=$RSYNC_OPTS"
echo $LIST|xargs -n1 -d, echo|xargs -n1 -P 0 -I% rsync --rsync-path='sudo rsync' ${RSYNC_OPTS} % ${DEST_DIR}
Run Code Online (Sandbox Code Playgroud)
然后,我有问题获得rsync进程的退出状态.我知道有可能获得一个pipestatus数组,但我需要捕获退出代码以了解rsync是否成功.
有谁知道?
echo "'param 1' 'param 2'" | xargs -n2 -I@ echo [@] [@]
Run Code Online (Sandbox Code Playgroud)
该命令输出:
[param 1 param 2] [param 1 param 2]
但是,我想输出:
[param 1] [param 2]
有没有办法做到这一点xargs?我计划使用它,-L1因此解决方案将处理多行和多个参数.
我想要以下行为,而不必使用选项明确指定它:
xargs -d '\n'
Run Code Online (Sandbox Code Playgroud)
与大多数命令不同,您不能只使用别名,因为管道无法识别别名(作为旁注,为什么这样设计?).我也尝试创建自己的~/bin/xargs脚本,但我认为这不像在脚本中读取"$ @"作为字符串那么简单.
有关默认情况下如何使分隔符成为换行符的任何建议?当我在路径中有空格(并使用find ... -print0 | xargs -0其他不需要的效果)时,我不想得到一堆错误.
UPDATE
我的shell脚本尝试是这样的:
/usr/local/bin/xargs -d '\n' "$@"
Run Code Online (Sandbox Code Playgroud) 我想知道在find命令中是否可行.我试图找到具有以下扩展名的所有特定文件,然后它将是SED.这是我当前的命令脚本:
find . -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | xargs sed -i -e 's/%%MEFIRST%%/mefirst/g'
Run Code Online (Sandbox Code Playgroud)
不幸的是,我对正则表达式并不熟悉,但这就是我需要的东西.
这是一个基本问题。我很好奇 xargs 和 gnu parallel 在并行化代码时有何不同?
是否存在您会使用其中一种而不是另一种的用例?
我问这个问题是因为我已经看到了并行化问题的答案,其中使用任何一种工具都被社区认为是可以接受的。