Dob*_*obr 515 bash filenames for-loop glob
我需要编写一个脚本,用不同的参数启动我的程序,但我是Bash的新手.我这样开始我的程序:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
这是我想要做的伪代码:
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
Run Code Online (Sandbox Code Playgroud)
所以我真的很困惑如何从第一个创建第二个参数,所以它看起来像dataABCD_Log1.txt并启动我的程序.非常感谢帮助.
PS我知道那里有类似的问题,但我没有发现创建我的日志文件名称.
Gor*_*son 682
首先要注意几个注意事项:当你使用它Data/data1.txt
作为参数时,它应该是真的/Data/data1.txt
吗(带有一个前导斜杠)?此外,外部循环是否应仅扫描.txt文件或/ Data中的所有文件?这是一个答案,/Data/data1.txt
仅假设和.txt文件:
#!/bin/bash
for filename in /Data/*.txt; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$filename" "Logs/$(basename "$filename" .txt)_Log$i.txt"
done
done
Run Code Online (Sandbox Code Playgroud)
笔记:
/Data/*.txt
扩展到/ Data中的文本文件的路径(包括/Data/part)$( ... )
运行shell命令并在命令行中的该点插入其输出basename somepath .txt
输出somepath的基本部分,从末尾删除.txt(例如/Data/file.txt
- > file
)如果您需要使用Data/file.txt
而不是运行MyProgram /Data/file.txt
,请使用"${filename#/}"
删除前导斜杠.在另一方面,如果它真的Data
不是/Data
要扫描,只需使用for filename in Data/*.txt
.
Con*_* Ma 310
很抱歉对线程进行了解析,但是每当你通过globbing迭代文件时,最好避免使用glob不匹配的极端情况(这会使循环变量扩展为(不匹配)glob模式字符串本身).
例如:
for filename in Data/*.txt; do
[ -e "$filename" ] || continue
# ... rest of the loop body
done
Run Code Online (Sandbox Code Playgroud)
参考:Bash陷阱
Jon*_*ler 71
for file in Data/*.txt
do
for ((i = 0; i < 3; i++))
do
name=${file##*/}
base=${name%.txt}
./MyProgram.exe "$file" Logs/"${base}_Log$i.txt"
done
done
Run Code Online (Sandbox Code Playgroud)
的name=${file##*/}
取代(壳参数扩展)删除前导路径名直到最后/
.
所述base=${name%.txt}
取代去除拖尾.txt
.如果扩展可以变化,这有点棘手.
Seb*_*icz 14
对每个文件运行命令:
对所有.txt文件执行某些操作(回显),
for f in *.txt; do echo ${f}; done;
Run Code Online (Sandbox Code Playgroud)
您可以将finds null分隔的输出选项与read一起使用,以安全地遍历目录结构。
#!/bin/bash
find . -type f -print0 | while IFS= read -r -d $'\0' file;
do echo "$file" ;
done
Run Code Online (Sandbox Code Playgroud)
所以对于你的情况
#!/bin/bash
find . -maxdepth 1 -type f -print0 | while IFS= read -r -d $'\0' file; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$file" 'Logs/'"`basename "$file"`""$i"'.txt'
done
done
Run Code Online (Sandbox Code Playgroud)
另外
#!/bin/bash
while IFS= read -r -d $'\0' file; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$file" 'Logs/'"`basename "$file"`""$i"'.txt'
done
done < <(find . -maxdepth 1 -type f -print0)
Run Code Online (Sandbox Code Playgroud)
将在脚本(流程)的当前范围内运行while循环,并在需要时允许将find的输出用于设置变量
归档时间: |
|
查看次数: |
691318 次 |
最近记录: |