4

我想使用 xonsh 来 bzip 目录中的几个文件。我首先尝试以下方法:

$ ls
table_aa.csv    table_amgn.csv  table_csco.csv  table_esrx.csv  table_hal.csv  table_jbl.csv  table_pcg.csv   table_zmh.csv
table_aapl.csv  table_amzn.csv  table_d.csv     table_gas.csv   table_hp.csv   table_jpm.csv  table_usb.csv
$ for fn in ls:
..    bzip2 fn
..
NameError: name 'ls' is not defined

好的,所以我$()明确使用

$ for fn in $(ls).split():
.     bzip2 fn
bzip2: Can't open input file fn: No such file or directory.
bzip2: Can't open input file fn: No such file or directory.

有一个更好的方法吗?

$ xonsh --version
('xonsh/0.3.4',)
4

2 回答 2

8

您与第二个示例非常接近。唯一需要注意的是这fn是一个 Python 变量名,所以你必须使用@()它来将它传递给子进程:

$ for fn in $(ls).split(): . bzip2 @(fn)

此外,在 v0.3.4 上,您可以使用 regex globbing 而不是 ls,

$ for fn in `.*`: . bzip2 @(fn)

至少在 master 上,您现在可以逐行遍历 !(),这意味着如果您与 ls 结婚,以下内容也将起作用:

$ for fn in !(ls): . bzip2 @(fn)

于 2016-06-23T01:35:38.417 回答
1

使用ls

for fn in !(ls):
    print(fn.rstrip())

使用 glob(可用于正则表达式、shell 和路径变体):

for fn in g`*`:
    print(fn)

使用 Python API(参见 os、glob 或 pathlib 模块):

import os
for fn in os.listdir():
    print(fn)
于 2017-03-11T05:43:51.260 回答