![批处理许多文件](https://linux22.com/image/116925/%E6%89%B9%E5%A4%84%E7%90%86%E8%AE%B8%E5%A4%9A%E6%96%87%E4%BB%B6.png)
我有许多单独的列表,其中所有包含“@”作为开头的行都是需要的。我现在正在用来sh list_of_commands
处理文件。我想知道是否有更聪明的方法来完成这项工作。
1)如何在不将所有命令行一一写入的情况下批量处理所有文件?
2)是否有通过在输入文件名称中添加后缀来命名输出文件的方法?
非常感谢!
答案1
以下脚本会爬取执行脚本的目录中的所有文件,并将命令一一应用到其中。那是你想要的东西吗?
#! /bin/sh
for file in *
do
if [[ -f "$file" ]]; then
# process the file with name in "$file" here
fi
done
您可以通过在上述循环中使用以下语句来根据请求执行文件重命名:
mv "$file" "$(echo" $file" | sed -n "s|^\(.*\)\(\.[0-9a-zA-Z]*\)$|\1_su\2|p")"
它将后缀“_su”放在文件扩展名后缀前面但位于文件名末尾。如果文件没有扩展名,则会将后缀放在文件名的末尾。
答案2
- 收集脚本中的命令(见下文)
- 将后缀附加到脚本命令行上给定的文件名,并将其用作输出文件名。
#!/bin/sh
for name in "$@"; do
some_utility "$name" >"$name.suffix"
done
"$@"
将扩展到命令行上所引用的内容列表。例如,与
$ ./script.sh a b "hello world" 123
该变量将在循环的连续迭代中$name
获取值a
、b
、hello world
和。123
您可以通过这种方式传递您的输入文件,或者像
$ ./script.sh input*.txt
这将给出当前目录中与给定模式匹配的所有文件。
然后,该变量$name
可以用作每个输入文件的名称,并且您可以通过简单地将其标记到该值的末尾来添加后缀(例如,将其用作输出文件的名称)。
将循环内的行替换为实际处理文件的行$name
。
该脚本必须可执行才能与./script.sh
.你用 来执行此操作chmod +x script.sh
。