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

Linux 在多个文件上运行命令并保持相同的名称,linux,macos,command-line-interface,Linux,Macos,Command Line Interface,如何在linux/mac中对多个文件运行shell命令,同时保持相同的名称(不包括扩展名) e、 g.假设我想使用命令将文件列表编译为其他同名文件: {command} [name].less [same-name].css 您可以这样做: ls sameName.* find <somepleace> -name \*.less | parallel <command> {} {.}.css 或者干脆 ls same* > list_of_filenam

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

e、 g.假设我想使用命令将文件列表编译为其他同名文件:

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

您可以这样做:

ls sameName.* 
find <somepleace> -name \*.less | parallel <command> {} {.}.css
或者干脆

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 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
选项保持不同命令的输出顺序

如果需要它在层次结构中的多个文件夹中运行,可以通过以下方式导入文件名:

ls sameName.* 
find <somepleace> -name \*.less | parallel <command> {} {.}.css
现在使用
-k
来维持秩序:

seq 1 10 | parallel -k echo
1
2
3
4
5
6
7
8
9
10
如果出于某种原因,您希望依次运行作业,只需将开关
-j 1
添加到
并行
命令中,即可将并行作业数设置为1


在您的Linux机器上尝试此操作,因为
GNU Parallel
通常安装在那里。在操作系统X下的Mac电脑上,安装GNU Parallel最简单的方法是使用
自制
-请在尝试之前询问您是否不熟悉。

也许我的帖子有误导性,我所说的
相同
,我不是指前缀,我指的是与
名称相同的名称现在,如果我将这些文件放在两个不同的目录中怎么办?因此,
命令
实际上是
folder1
中的脚本,css文件位于
folder2
中,而
folder3
中的文件较少。我们如何才能以某种方式更改此命令,使其像这样工作?@arian hosseinzadeh这符合您的要求吗?请你检查一下我是否把路径号弄乱了,比如使用“echo”命令作为{command}?请注意,{}只是一种识别命令在行中运行位置的方法。删除它们并重试,我正在编辑我的答案以避免将来的误解。谢谢你的回复。@Hardon:我运行这个命令:
for I in$(ls style | grep.less);做node_modules/.bin/lessc$(echo'style/$i$(echo'public/stylesheets/$i'| sed-es/.less/.css/));完成
并返回此错误:
-bash:node\u modules/.bin/lessc:line 3:意外标记附近的语法错误
''当我只在一个文件上运行相同的命令时:<代码> NoDeMys//BI/LASC样式/*>公共/样式表/样式.CSS<代码>,它不返回这个错误。@哈顿:也许您没有在原始命令中考虑<代码> > /代码>?不幸的是,我不能运行这个命令,因为它是我想在Heluu上运行的脚本的一部分,我不能。安装GNU并行
我想