标签: xargs

结合 sed 和 xargs 获得源和输出文件名

我有一种情况,我有一些这样的输入文件:

M2U0001.MPG
M2U0180.MPG
Run Code Online (Sandbox Code Playgroud)

我想在目录中的每个类似命名的文件上运行一个命令(在 Bash shell 中)。我希望将当前文件名作为输入提供给此命令,并将文件名的修改版本作为输出文件提供。下面是一个例子:

ffmpeg -i M2U0001.MPG M2U0001_fixed.MPG
Run Code Online (Sandbox Code Playgroud)

我有使用 xargs 和 sed 的想法,但这是我得到的:

ls -1 *.MPG | xargs -I{} ffmpeg -i {} `echo {} | sed -r 's/[0-9]{2,}/&_fixed/'`
Run Code Online (Sandbox Code Playgroud)

但这会导致在两个位置都输出原始文件名。我完全以错误的方式解决这个问题吗?

我发现如果我像这样将文件名直接回显到嵌入的块中,它会起作用:

echo M2U0001.MPG | sed -r 's/[0-9]{2,}/&_fixed/'
Run Code Online (Sandbox Code Playgroud)

bash sed xargs

3
推荐指数
1
解决办法
4016
查看次数

xargs/exec 的参数列表太长

我正在 CentOS 服务器上工作,我必须四处移动并将数百万个文件整理在一起。我已经尝试了许多类似下面的内容,但所有这些都因参数列表太长错误而失败。

命令:

find ./ -iname out.* -type f -exec mv {} /home/user/trash
find ./paramsFile.* -exec cat > parameters.txt 
Run Code Online (Sandbox Code Playgroud)

错误:

-bash: /usr/bin/find: Argument list too long
-bash: /bin/cat: Argument list too long
Run Code Online (Sandbox Code Playgroud)

或者

echo ./out.* | xargs -I '{}' mv /home/user/trash
(echo ./paramsFile.* | xargs cat) > parameters.txt  
Run Code Online (Sandbox Code Playgroud)

错误:

xargs: argument line too long
xargs: argument line too long              
Run Code Online (Sandbox Code Playgroud)

第二个命令也从未完成。我听说过一些关于通配符的事情,但我不确定我是否完全理解它。欢迎任何提示或建议!

linux bash find xargs exec

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

将 xargs 与 $() 一起使用 - 运算符优先级?

受到这个问题的启发。简而言之,最初的问题是“如何将所有文件全部:2f转换-为文件夹内的所有文件”。例如,如果我有一个文件,./abc:2fdef它应该重命名为./abc-def.

起初我认为这是一个简单的任务......find所有文件然后sed替换:2f-. 在尝试构建单行时,我想出了以下命令:

find . -type f -name '*:2f*' | xargs -I {} mv {} $(echo {} | sed "s/:2f/-/ig")
Run Code Online (Sandbox Code Playgroud)

但是它不起作用。经过大量测试,我发现问题出在xargs部分 - $() 在用文件名xargs替换地方之前执行{}。详细说明,

xargs -I {} mv {} $(echo {} | sed "s/:2f/-/ig")
Run Code Online (Sandbox Code Playgroud)

被评估为($(...)被评估)

xargs -I {} mv {} {}
Run Code Online (Sandbox Code Playgroud)

进而

mv ./abc:2fdef ./abc:2fdef
Run Code Online (Sandbox Code Playgroud)

这不是我所期待的。所以,我的问题是,{}在评估$(...)零件之前,我可以让 xargs 全部替换为文件名吗?

linux bash xargs

3
推荐指数
1
解决办法
806
查看次数

获取 xargs:尝试在文件中查找文本时未终止的引号

我正在使用带有 bash shell 的 Mac 10.9.5。我试图在一组文件中搜索文本实例,但由于某种原因,在一个特定目录中,我收到了这个奇怪的“未终止的引用”错误......

Daves-MacBook-Pro:sbadmin davea$ find src/main/webapp/WEB-INF/ -name "*" | xargs grep 'addresses' > /tmp/addr
xargs: unterminated quote
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题?

bash grep xargs

3
推荐指数
1
解决办法
6401
查看次数

立即为每一行标准输入执行一个命令?

如何stdin立即为每一行执行命令?

示例

(echo abc; sleep 10; echo def;) | ???
Run Code Online (Sandbox Code Playgroud)

xargs工具不会完成这项工作,因为它会阻塞直到看到所有数据(等待 stdout 关闭)。然而,当新行可用时,我必须立即执行命令。

linux bash command-line xargs gnu-parallel

3
推荐指数
1
解决办法
1777
查看次数

指定文件列表作为 pdftk 的输入

我有一个文件列表,我需要将这些文件指定为 pdftk 的输入,以便它按照指定的顺序连接它们。我在 pdftk 手册页中没有看到输入文件列表作为选项,但也许有一种解决方法可以实现类似的结果?

xargs pdftk

3
推荐指数
1
解决办法
2007
查看次数

xargs -I 行为

一个变量var包含多个参数,每个参数由一个新行分隔。

echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three
Run Code Online (Sandbox Code Playgroud)

但是,当省略-I%字符时,我得到以下信息:

echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three
Run Code Online (Sandbox Code Playgroud)

我曾经读过 {} 将替代当前参数(就像 find 一样),但这不会发生。我究竟做错了什么?

bash xargs

2
推荐指数
1
解决办法
2414
查看次数

删除所有非 jpeg 文件

我有练习,我必须删除所有文件,而不是jpeg.

我试过了find -type f |xargs file| grep -iv 'jpeg',但它不起作用。

linux bash find xargs

2
推荐指数
1
解决办法
2834
查看次数

使用 xargs 将参数传递给带管道的子外壳

我想重命名一些文件。我想我可以使用 xargs 来做到这一点。

find ./ -name "upload.log-*" 
./upload.log-20180622.gz-20180624.gz-20180626.gz
./upload.log-20180624.gz-20180626.gz
./upload.log-20180620.gz-20180622.gz-20180624.gz-20180626.gz
./upload.log-20180621.gz-20180623.gz-20180625.gz-20180627.gz

find ./ -name "upload.log-*" -print | cut -d"-" -f-2
./upload.log-20180622.gz
./upload.log-20180624.gz
./upload.log-20180620.gz
./upload.log-20180621.gz
Run Code Online (Sandbox Code Playgroud)

我正在尝试以下操作,但似乎不起作用

find ./ -name "upload.log-*" | xargs -I '{}' sh -c "echo $1 $(echo $1 | cut -d"-" -f-2)" "{}"
Run Code Online (Sandbox Code Playgroud)

bash sh xargs pipe command-line-arguments

2
推荐指数
1
解决办法
4823
查看次数

发现参数列表太长

我想在许多文件中搜索一个字符串。

我用了 find /archive/* -print0 | xargs -0 grep 'robert' -sl

有没有一个简单的方法来做到这一点?

linux find xargs

0
推荐指数
1
解决办法
2117
查看次数

标签 统计

xargs ×10

bash ×8

linux ×5

find ×3

command-line ×1

command-line-arguments ×1

exec ×1

gnu-parallel ×1

grep ×1

pdftk ×1

pipe ×1

sed ×1

sh ×1