我有一种情况,我有一些这样的输入文件:
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) 我正在 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)
第二个命令也从未完成。我听说过一些关于通配符的事情,但我不确定我是否完全理解它。欢迎任何提示或建议!
受到这个问题的启发。简而言之,最初的问题是“如何将所有文件全部: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 全部替换为文件名吗?
我正在使用带有 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)
任何想法如何解决这个问题?
如何stdin立即为每一行执行命令?
示例:
(echo abc; sleep 10; echo def;) | ???
Run Code Online (Sandbox Code Playgroud)
该xargs工具不会完成这项工作,因为它会阻塞直到看到所有数据(等待 stdout 关闭)。然而,当新行可用时,我必须立即执行命令。
我有一个文件列表,我需要将这些文件指定为 pdftk 的输入,以便它按照指定的顺序连接它们。我在 pdftk 手册页中没有看到输入文件列表作为选项,但也许有一种解决方法可以实现类似的结果?
一个变量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 一样),但这不会发生。我究竟做错了什么?
我有练习,我必须删除所有文件,而不是jpeg.
我试过了find -type f |xargs file| grep -iv 'jpeg',但它不起作用。
我想重命名一些文件。我想我可以使用 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) 我想在许多文件中搜索一个字符串。
我用了 find /archive/* -print0 | xargs -0 grep 'robert' -sl
有没有一个简单的方法来做到这一点?