运行 多个文件的命令并保持相同的名称
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
- 如果您不熟悉,请在尝试前询问。
如何对 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
- 如果您不熟悉,请在尝试前询问。