我有一个目录,里面有 10144911 个文件。到目前为止,我已经尝试了以下方法:
for f in ls; do sed -i -e 's/blah/blee/g' $f; done撞毁了我的外壳,ls它在一个 tilda 中,但我不知道如何制作一个。
ls | xargs -0 sed -i -e 's/blah/blee/g' 太多的参数 sed
find . -name "*.txt" -exec sed -i -e 's/blah/blee/g' {} \; 不能再分叉没有更多的记忆
关于如何创建这种命令的任何其他想法?这些文件不需要相互通信。ls | wc -l似乎工作(非常慢)所以它必须是可能的。
例如,包含 jpeg 文件的目录:如何轻松打开当前目录中最新的 jpeg?
我有一个包含编号文件的目录,例如 1_foo.txt 2_bar.asc 13_test.png,并希望使用尽可能简单的 bash 命令将它们移动到单独的目录(例如 1、2 和 13)中。
创建编号目录很容易:
mkdir $(seq 1 15)
Run Code Online (Sandbox Code Playgroud)
我还想出了一个命令来将文件复制到各自的目录中:
seq 15 -1 1 | xargs -I@ mv @_* @
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为 * 与 xargs 一起使用时被解释为普通字符,给我这样的错误:“mv: File '15_*' not found.”。
有什么简单的方法可以在 xargs 调用的命令中使用 * 作为通配符吗?
作为了解如何使用管道操作绑定优先级的一种工具,我试图为每个目录打印一个文件的路径:
find $PWD -type d | xargs --delimiter "\n" -I% -n 1 (find % -maxdepth 1 | head -1)
Run Code Online (Sandbox Code Playgroud)
我明白了no matches found: (find % -maxdepth 1 | head -1)。没有括号我会得到xargs: find: terminated by signal 13所以我很确定我们需要以某种方式使管道右关联。
如何将 xargs 输入传递给包含管道的命令?(请不要告诉我使用-exec,我想学习如何操作其他问题的绑定优先级)。
我试图找到分布在子目录中的某种类型的所有文件,出于我的目的,我只需要文件名。我尝试通过 去除路径组件basename,但它不适用于xargs:
$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.
Run Code Online (Sandbox Code Playgroud)
对于这些变体中的任何一个,我都得到了同样的东西(完全相同的错误):
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
Run Code Online (Sandbox Code Playgroud)
另一方面,这按预期工作:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
这发生在最新的 Cygwin 和 Debian 5.0.3 上。我的诊断是 xargs 出于某种原因将两个输入行传递给 basename,但为什么呢?这里发生了什么?
我正在尝试使用 xargs 为每个提供的参数运行一个命令,但不幸的是 --replace/-I 标志在与 -n 结合时似乎无法正常工作。无论 -n 选项如何,{} 似乎都将扩展为从 stdin 读取的完整参数列表。
不幸的是,网络上的所有示例似乎都是用于命令 (mv, cp, rm) 的,这些命令将采用多个参数,其中 {} 展开。
例如,在运行时:
echo a b c d | xargs -n 1 -I {} echo derp {}
Run Code Online (Sandbox Code Playgroud)
输出是:
derp a b c d
Run Code Online (Sandbox Code Playgroud)
但我预计:
derp a
derp b
derp c
derp d
Run Code Online (Sandbox Code Playgroud)
但是,在没有 -I {} 的情况下运行它会产生预期的结果:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Run Code Online (Sandbox Code Playgroud)
有没有办法用 xargs 实现这一点?我的最终目的是用它来运行多个(并行)ssh 会话,比如
echo server{1..90} | xargs …Run Code Online (Sandbox Code Playgroud) 在具有双核和 4GB RAM 的 Windows XP 上使用 Cygwin 运行脚本
cat url_list.txt | xargs -P50 wget -i
Run Code Online (Sandbox Code Playgroud)
我试图通过4GB的URL来下载(大约 4300 万)
大约第一个小时工作正常,然后 Bash shell 和下载停止,即使它只有 2% 通过 URL 列表。
有什么想法可能是错的?
调试为什么一小时后停止的最佳方法是什么?
我有一个这样的目录
mkdir test
cd test
touch file{0,1}.txt otherfile{0,1}.txt stuff{0,1}.txt
Run Code Online (Sandbox Code Playgroud)
我想在目录中的某些类型的文件上运行一些命令,例如 ls ,并将 * (glob) 扩展到文件名的所有可能性。
echo 'file otherfile' | tr ' ' '\n' | xargs -I % ls %*.txt
Run Code Online (Sandbox Code Playgroud)
此命令不会扩展 glob 并尝试查找文字“file*.txt”
我如何编写一个类似的命令来扩展 globs?(我想使用 xargs 以便该命令可以并行运行)
目前我正在使用两个命令,我相信一定有更好的方法......
wim@wim-acer:~/ffmpeg$ find . -name "*.h" -print0 | xargs -0 grep -i invalid\ preset
wim@wim-acer:~/ffmpeg$ find . -name "*.c" -print0 | xargs -0 grep -i invalid\ preset
Run Code Online (Sandbox Code Playgroud) 问候 Emacsers
我在“Ubuntu 10.04.1 LTS”上运行 GNU Emacs 23.1.1 并且我在标准 Linux 内核源代码(vanilla)上使用内置 Mx rgrep 执行的任何搜索过早结束,以下错误打印到 emacs echo区域:
Grep exited abnormally with code 123
Run Code Online (Sandbox Code Playgroud)
我已经在 Redhat 系统上看到它一段时间了,还有其他(大型)代码库,有没有人看到或者更好地解决这个问题?
谢谢!
编辑:出于我以外的原因,stackexchange 不允许我在下面编辑我的评论,所以我会在这里更新。
按照下面的评论,我尝试运行 rgrep 在 emacs shell 缓冲区中运行的相同命令
find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.svn -o -path \*/.git
-o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o -type f \( -name \*.\[ch\] \) -p
rint0 …Run Code Online (Sandbox Code Playgroud)