所以我有一些文件,其中包含要使用的内容和文件标题中的一些输入参数。我想更改输入但保持内容相同。我还根据正在使用的输入来命名文件。例如,假设我有一个文件名:
input1-input2-input3
我想复制该文件并将 input3 更改为 input4 或类似的东西,我希望名称能够反映这一点。我一直在尝试编写一个简单的 bash 脚本,如下所示:
#!/bin/bash
#Inputs:{file to be copied} {solvent to change}
file=${1?No file given}
input3=${2?no input}
做一些改变
cp file newfile
互联网给了我一些关于“做一些改变部分”的提示,比如这个提示: http ://www.peteryu.ca/tutorials/shellscripting/batch_rename 所以我目前的尝试看起来像这样,文件名叫做
测试-gs-xcf-solvent.gjf
#!/bin/bash
#Inputs:{file to be copied} {solvent to change}
file=${1?No file given}
solvent=${2?no solvent given}
filename=$(basename "$file" .gjf) ls -1 $file | awk '{print("mv "$1 "" $1)}' | sed "s/solvent/$solvent/2" > rename_"$filename".txt
newfile=awk '{print $3}' rename_"$filename".txt
if [ -f "$newfile" ]
then
echo "$newfile" > "$dir/newfile"
fi
cp "$file" "$newfile"
~
这对我不起作用,因为我认为该链接正在回答一个不同的问题。
总之,我有一个名为:
input1-input2-input3
我想编写一个如下所示的 bash 脚本:
.\bash.bash input1-input2-input3 input4
输出为:
input1-input2-input4
理论上,我希望将来能够更改所有这些字段,但现在,我只想让示例更简单。
谢谢你们!这是我在这里的第一篇文章,所以如果我有任何格式问题,请告诉我
嗨,德国巴塞纳斯 :) 我们准备了一个小脚本,可以满足您在问题末尾提出的要求:
剧本
打破它
我们已经尝试了该脚本
bash 3.2.57
,它应该按原样运行。它只会输出将添加到新复制文件中的文件名,但您可以根据需要对其进行调整。让我们来看看每一块。这部分是从您的示例中复制的,因此我们不会详细介绍。我们只想指出,我们更改了第一个输入参数的名称以尝试使命名更清晰。
这部分会将文件的基本名称保存到
old_file_base
变量中。不需要这个额外的步骤,但我们添加了它以尝试使一切更清晰。即使提供的文件路径是绝对路径,我们也会运行此命令以使脚本正常工作(即,它是从根文件夹给出的,因此它以 . 开头/
。绝对路径的一个示例是/absolute/path/to/foo
)。awk
这就是程序的“心脏”所在。我们将首先使用
echo
将 的内容输出old_file_name
到 STDOUT,然后使用管道 (|
) 将echo
的 STDOUT 重定向到awk
的 STDIN。这种方式awk
将作用于我们在上一步中获得的基本名称。请注意,我们
-v
在调用时使用选项awk
。我们这样做是为了“传递”外部变量,awk
以便在处理输入时可以使用它们。-v sol=$solvent
我们可以在其中引用,sol
其awk
值将是solvent
脚本中变量的值(即运行脚本时传递的第二个参数)。awk
然后我们在花括号之间找到“脚本”。它包含 3 个不同的指令:a)
split($0, tmp, "-")
:该split()
函数将获取整个输入($0
withinawk
)并将其拆分为-
字符。结果将在tmp
数组中返回。b)
tmp[3] = sol
:我们将只分配sol
给第三个元素。请注意awk
从 1 而不是 0 开始索引!我们正在对索引进行硬编码,因为我们知道输入文件名的格式。否则,您可能需要在这里小心并手动检查数组的大小。c)
print sprintf("%s-%s-%s", tmp[1], tmp[2], tmp[3])
:该sprintf()
函数将“返回”我们通过将传递的值分配给用百分比 (%
) 符号定义的占位符来获得的字符串。与 C 中一样,%s
是字符串的占位符。在这种情况下,将返回由连字符 ( ) 连接sprintf()
的数组的三个元素作为字符串。由于我们之前用所需的输出更改了 的值,结果将是我们所期望的。然后我们调用将该字符串输出到 STDOUT。由于这整个命令在命令替换结构内(即),输出到 STDOUT 的内容将被分配给变量。tmp
-
tmp[3]
print
$()
new_file
然后我们就有了想要的输出!您可以通过运行
echo $new_file
并检查终端的输出来检查。如果您在命令行上传递第三个参数来控制要在文件名中更改的输入,您可以awk
通过-v
选项将其传递给并处理您想要的名称awk
。样本输出
这些是我们在机器上得到的一些输出:
我们确实为我们的脚本命名
foo.sh
,我们的名字有点糟糕:P我希望这个脚本能以任何方式帮助你。如果我以任何方式误解了您的查询,或者您需要任何进一步的指导,请告诉我,以便我伸出援手:)