如何在linux / mac中的几个文件上运行shell命令,同时保持相同的名称(不包括扩展名)?
e.g。让我们假设我想使用命令将一个文件列表编译成一些具有相同名称的其他文件:
{command} [name].less [same-name].css
答案 0 :(得分:4)
编辑:更一般地说,假设两个目标位于两个不同的路径中,例如“path / to / folder2”和“path / to / folder3”,请记住,您始终可以指定用于的列表对于循环,您可以尝试:
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
仍然抱怨残忍,也许是非优雅的解决方案。
答案 1 :(得分:0)
您可以这样做:
ls sameName.*
或只是
ls same* > list_of_filenams_starting_with_SAME.txt
答案 2 :(得分:0)
恕我直言,更简洁,高效和直观的解决方案是使用GNU Parallel
。你的命令变为:
parallel command {} {.}.css ::: *.less
因此,举例来说,让我们说你的"命令" 是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一样多的内核并行运行命令,因此它会更快。如果这样做,您可能希望-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
- 如果您不熟悉,请在尝试之前询问。