将工作目录中的文件名放入文本文件中,以便可以对其运行命令的脚本

将工作目录中的文件名放入文本文件中,以便可以对其运行命令的脚本

我想编写一个脚本,将工作目录中的文件名(带有特定扩展名)放入文本文件中,并添加一些附加字符串:

例如,如果我对带有扩展名的文件感兴趣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替换io

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,运行以下命令,通过添加"{}"我们将文件名作为参数 0
  • mv "$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

相关内容