Completed compressing directory ./Directory1 with meta characters in it
Completed compressing directory ./Directory2 with meta characters in it
Completed compressing directory ./Directory3 with meta characters in it
2018 July Update:
如果你喜欢黑客并玩耍,这里有一些有趣的东西:
echo "a b c" > a.txt
echo "123" >> a.txt
echo "###this is a comment" >> a.txt
cat a.txt
myCommandWithDifferentQuotes=$(cat <<'EOF'
echo "command 1: $@"; echo 'will you do the fandango?'; echo "command 2: $@"; echo
EOF
)
< a.txt xargs -I @@ bash -c "$myCommandWithDifferentQuotes" -- @@
输出:
command 1: a b c
will you do the fandango?
command 2: a b c
command 1: 123
will you do the fandango?
command 2: 123
command 1: ###this is a comment
will you do the fandango?
command 2: ###this is a comment
10 回答
请注意,这是Useless Use Of cat . 我把它写成:
(是的,重定向可以在命令的开头 . )
据推测
command1
和/或command2
将包含一个或多个%
个字符;否则-I %
的-I %
选项就没有多大意义了 .使用GNU Parallel,您可以:
观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
这只是没有xargs和cat的另一种方法:
您可以使用
{} =文本文件中每一行的变量
我做的一件事是添加.bashrc / .profile这个函数:
然后你可以做的事情
它比xargs或-exec更简洁 . 如果您还需要该行为,您还可以修改函数以将读取的值插入命令中的任意位置 .
我更喜欢允许干运行模式的风格(没有
| sh
):也适用于管道:
派对有点晚了 .
我使用下面的格式在迁移之前用数千个小文件压缩我的目录 . 如果您在命令中不需要单引号,它应该可以工作 .
经过一些修改,我确信它对某人有用 . 测试
Cygwin
(babun)find .
在这里找到-maxdepth 1
不要进入子目录! -path .
排除 . /当前目录路径-type d
仅匹配目录-print0
以null字节\ 0分隔输出| xargs
管道到xargs-0
输入为空分隔字节-I @@
占位符是@@ . 用输入替换@@ .bash -c '...'
运行Bash命令{...}
命令分组&&
仅在上一个命令成功退出时执行下一个命令(退出0)最终
;
很重要,否则会失败 .输出:
2018 July Update:
如果你喜欢黑客并玩耍,这里有一些有趣的东西:
输出:
说明:
- 创建单个线性脚本并将其存储在变量中
-
xargs
读取a.txt
并将其作为bash
脚本执行-
@@
确保每次传递整行- 在
--
之后放置@@
确保@@
被视为bash
命令的位置参数输入,而不是bash
startOPTION
,即-c
本身,这意味着run command
--
是神奇的,它适用于许多其他的东西,即ssh
,甚至kubectl
对我有用的另一个可能的解决方案是 -
注意最后的'bash' - 我假设它作为argv [0]传递给bash . 如果没有此语法,则每个命令的第一个参数都将丢失 . 它可能是任何一个词 .
例:
我目前的BKM是这样的
不幸的是,这使用了perl,它比bash更不容易安装;但它处理了接受答案的更多输入 . (我欢迎一个不依赖于perl的无处不在的版本 . )
@ KeithThompson的建议
很棒 - 除非你的输入中有shell注释字符#,在这种情况下,第一个命令的一部分和第二个命令的所有部分都将被截断 .
如果输入来自文件系统列表(例如ls或find),并且编辑器在其名称中创建带有#的临时文件,则哈希#可能非常常见 .
问题示例:
糟糕,这是问题所在:
啊,那更好:
这似乎是最安全的版本 .
(
-0
可以删除,tr
替换为重定向(或者文件可以替换为空分隔文件) . 它主要在那里,因为我主要使用xargs
与find
与-print0
输出)(这也可能与没有-0
扩展名的xargs
版本)它是安全的,因为args会将参数传递给shell作为执行它的数组 . 当使用
["$@"][1]
获取所有shell时,shell(至少bash
)会将它们作为未更改的数组传递给其他进程如果使用
...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";'
,如果字符串包含双引号,则赋值将失败 . 对于使用-i
或-I
的每个变体都是如此 . (由于它被替换为字符串,您始终可以通过在输入数据中插入意外字符(如引号,反引号或美元符号)来注入命令)如果命令一次只能获取一个参数:
或者使用更少的流程:
如果您有GNU
xargs
或其他具有-P
扩展名并且您想要运行32个进程并行,每个命令的参数不超过10个:这应该对输入中的任何特殊字符都很健壮 . (如果输入为空分隔 . )如果某些行包含换行符,则
tr
版本将获得一些无效输入,但对于换行符分隔文件,这是不可避免的 .