运行 多个文件的命令并保持相同的名称

Running a command over several files and keep the same name

如何对 linux/mac 中的多个文件执行 运行 shell 命令,同时保持相同的名称(不包括扩展名)?

例如假设我想使用命令将文件列表编译为一些其他同名文件:

{command} [name].less [same-name].css 

你可以这样做:

ls sameName.* 

或者干脆

ls same* > list_of_filenams_starting_with_SAME.txt

编辑:更一般地说,假设这两个目标位于两个不同的路径中,例如 "path/to/folder2" 和 "path/to/folder3" 并记住您始终可以指定 for 中使用的列表循环,你可以试试:

for i in $(ls path/to/folder3 | grep .less); do . /path/to/folder1/script.sh  $(echo "path/to/folder3/$i $( echo "path/to/folder2/$i" | sed -e s/.less/.css/)") ; done

仍然对残忍和可能不优雅的解决方案感到抱歉。

恕我直言,更简洁、高效和直观的解决方案是使用 GNU Parallel。您的命令变为:

parallel command {} {.}.css ::: *.less

因此,例如,假设您的 "command"ls -l,并且您的目录中有这些文件:

Freddy Frog.css     
Freddy Frog.less
a.css
a.less

那么你的命令就是

parallel ls -l {} {.}.css ::: *.less

-rw-r--r--  1 mark  staff  0  7 Aug 08:09 Freddy Frog.css
-rw-r--r--  1 mark  staff  0  7 Aug 08:09 Freddy Frog.less
-rw-r--r--  1 mark  staff  0  7 Aug 08:09 a.css
-rw-r--r--  1 mark  staff  0  7 Aug 08:09 a.less

好处首先是它是一种漂亮、简洁的语法和一行代码。其次,它将 运行 使用与您的 CPU(s) 一样多的内核并行执行命令,因此速度会更快。如果这样做,您可能需要 -k 选项来保持不同命令的输出顺序。

如果您需要它 运行 跨越层次结构中的许多文件夹,您可以像这样通过管道传输文件名:

find <somepleace> -name \*.less | parallel <command> {} {.}.css

要理解最后两点(管道和顺序),请看这个例子:

seq 1 10 | parallel echo
6
7
8
5
4
9
3
2
1
10

现在用 -k 来保持顺序:

seq 1 10 | parallel -k echo
1
2
3
4
5
6
7
8
9
10

如果出于某种原因,你想一个接一个地运行作业,只需将开关-j 1添加到parallel命令以设置并行数职位增加到 1.

在您的 Linux 机器上试试这个,因为 GNU Parallel 通常安装在那里。在 OS X 下的 Mac 上,安装 GNU Parallel 的最简单方法是使用 homebrew - 如果您不熟悉,请在尝试前询问。