我想编写一个脚本,将工作目录中的文件名(带有特定扩展名)放入文本文件中,并添加一些附加字符串:
例如,如果我对带有扩展名的文件感兴趣i
,则我的目录中的文件是:
1.b 1.i 2.i 2.z 3.i
我想创建一个文本文件,如下所示:
command_1
command_2 1.i 1.o && command_2 2.i 2.o && command_2 3.i 3.o &
答案1
我找到了一个更好的解决方案。
跳过创建文本文件,只需创建脚本来执行文件夹中的多个文件
#!/bin/bash
for file in *.i*
do
[[ "${file##*.}" =~ fchk ]] && continue
qchem "$file" "${file%.*}".out
done
clear
echo "DONE!"
答案2
考虑到您的回答,您实际上并不想创建文本文件,而只是搜索文件并处理它们。您可以使用该find
命令来实现这一点,例如,重命名所有以 结尾的文件,然后.i
替换i
为o
:
find -maxdepth 1 -type f -name "*.i" -exec bash -c 'mv "$0" "${0/i/o}"' "{}" \;
解释
-maxdepth 1
留在当前目录-type f
仅搜索文件-name "*.i"
搜索以以下结尾的文件.i
-exec
对文件执行以下命令,{}
替换为文件名,需要以\;
bash -c
启动一个子 shell,运行以下命令,通过添加"{}"
我们将文件名作为参数 0mv "$0" "${0/i/o}"
i
通过替换来重命名文件o
– 当然这只是一个例子,可以用你喜欢的任何命令(链)来替换\;
完成-exec
选项
对于可以同时处理多个文件的命令,您可以替换\;
为+
链接参数,请参阅在 -exec 命令中使用 '+' (加号) 和 ';' (分号) 有什么区别?。
答案3
如果由于某种原因您想要使用文件来存储文件列表,则可以采用以下替代方法:
ls *.i > input.txt
for F in $(cat /path/to/input.txt) ; do
...
done;
或者,如果你的文件名中有空格
while read F ; do
...
done </path/to/input.txt