例如,当前脚本根目录的文件夹 Action 中有 .py
文件:
那么运行的结果就是生成 "A","B","C","D"。
最近一直在用 PowerShell,发现这个需求在 PowerShell 中的实现惊人的简洁。
别的编程语言,还能用自带的库函数,写出比这更简洁又具有可读性的代码吗?
如果你觉得还可以,欢迎来挑战。
"$PSScriptRoot\Action" | dir -File -Filter '*.ps1'|% BaseName | Join-String -DoubleQuote -Separator ','
感觉目前的答案中感觉 Ruby 的可读性最好
过滤器参数是不必要的,所以可以改为
("$PSScriptRoot\Action" | dir '*.ps1' -File).BaseName | Join-String -Separator ',' -DoubleQuote
Join-String -Separator ',' -DoubleQuote
可以使用符号缩短,对于我而言那会降低可读性,所以并没这么上个追加写错了,路径参数传递了两遍,刚刚才发现,其实应该是
("$PSScriptRoot\Action\*.ps1" | dir -File).BaseName | Join-String -Separator ',' -DoubleQuote
1
FH0 2021-05-05 10:04:13 +08:00 1
|
2
aloxaf 2021-05-05 10:31:45 +08:00 1
```zsh
echo \"${(j:",":)${(A)=:-$(print *.py(:r))}}\" ``` 简洁,并且具有可读性(确信 |
3
aloxaf 2021-05-05 10:36:16 +08:00
```zsh
f=(*.py(:r));echo \"${(j:",":)f}\" ``` 比起强行塞到一个表达式里写成两段好像更好( |
4
msg7086 2021-05-05 10:42:15 +08:00 1
Ruby 的大概这样?
Dir['Action/*.py'].map{|f| '"' + Pathname.new(f).basename.sub_ext('').to_s + '"'}.join(',') 如果能接受两边有 [] 的话,直接数组转字符串或者转换成 JSON 都行。 |
5
AndyAO OP @msg7086 #4
比起其他 Shell 语言来说,自以为可读性比那几个 Shell 语言强很多,像我这种完全不懂的人也能看明白大概是什么意思。 能做到这种简洁性和可读性真是太好了!这个比 PowerShell 强 最近翻看过几本松本行弘的书,感到这个人对于编程语言有着深刻的理解。 |
6
AndyAO OP |
7
aloxaf 2021-05-05 11:19:05 +08:00
@AndyAO pwsh 也能很简洁吧:'"' + ((dir *.py |% BaseName) -join '","') + '"'
|
8
KomiSans 2021-05-05 11:56:12 +08:00
`
let co = fs.readdirSync("../Action").filter(x=>x.indexOf(".py")>0).map(single=>single.replace(".py","")).toString(); ` Node.JS 好像有点复杂 |
9
ctro15547 2021-05-05 11:57:26 +08:00 1
import os
print((lambda x:[i for i in x if i.find('.py') != -1])(os.listdir())) 有办法弄成一行吗。。。 |
10
AndyAO OP @aloxaf #7
按的也是 pwsh,你的写法的启发在于,直接在 path 用通配符,而不是用过滤器参数,问题貌似在于你遗漏了 -File 参数,这就导致如果文件夹名是.py 结尾可能会有错。 至于使用那种拼接操作,这个虽然更简洁,但是可读性并不好,我之前就是这么写的,后来换了 Join-String 。 你这个的意义在于,很好的展示了,只要愿意用符号 pwsh 比 zsh 和 bash 在长度方面也不差。 |
11
AndyAO OP |
13
AlisaDestiny 2021-05-05 13:14:14 +08:00 2
python3 -c "import os;print([x.split('.')[0] for x in os.listdir('.') if x.endswith('.py')])"
|
14
O5oz6z3 2021-05-05 13:17:02 +08:00 1
python3 另外四种写法……
单引号+文件检测 ```python from pathlib import Path print(str([x.stem for x in Path('.').glob('*.py') if x.is_file()])[1:-1]) ``` 双引号 ``` python -c "from pathlib import Path; print(','.join([f'\"{x.stem}\"' for x in Path('.').glob('*.py')]))" python -c "from pathlib import Path; print(*[f'\"{x.stem}\"' for x in Path('.').glob('*.py')], sep=',')" python -c "from pathlib import Path; from json import dumps; print(dumps([x.stem for x in Path('.').glob('*.py')], ensure_ascii=False)[1:-1])" ``` |
15
learningman 2021-05-05 13:29:46 +08:00 via Android
@ctro15547 可以,__import__
|
16
no1xsyzy 2021-05-05 19:57:04 +08:00
#!/usr/bin/env racket
#lang rash (require rash/demo/setup) ls |>> string-split _ "\n" =filter= string-suffix? _ ".py" =map= string-append "\"" _ "\"" |> string-join _ "," |> display 除了每个 string 相关函数都带个 string- 前缀外挺简短的。 |
17
zbinlin 2021-05-05 22:36:02 +08:00
bash shell 的这个还不简单吗?
ls -mQ *.py 2>/dev/null |
18
TunkShif 2021-05-06 11:51:58 +08:00 via Android
|
19
AoEiuV020 2021-05-06 12:12:08 +08:00
shell, 本来以为很简单,没想到写出来还是用了 3 个管道,讲道理还是编程语言直接遍历更好,
ls *.py|sed 's/\(.*\).py/"\1"/'|tr -t '\n' ','|sed 's/,$//' |