通过SH文件复制和替换文本



我在unix和shell脚本方面没有任何经验,但我需要用相同的文件填充100个类似的文件夹,只有特定文本的差异。

例如,我有一个"dataxxx"文件夹,它有2个文件。我需要将该文件夹复制到data1、data2、data3。。。,其中的文件是简单的文本文件,我需要将dataxxx的所有实例替换为文件夹名称(data1, data2, data3, ..., data100)

这里是如何完成任务的第一个示例。注意,这个例子很容易推广到任何符号,而不仅仅是数字{1..100},并说明了许多有用的shell习惯用法。

首先,创建一个包含100个条目的文件,每行一个(您可以使用编辑器,或者该文件可能是数据库查询的结果,等等)

cat > list <<HERE
1
2
3
...
100
HERE

(上面展示了如何在没有编辑器的情况下创建文件,并且可以将其放入脚本中)。

或者你可以使用脚本来计算(参见David Rankin的回答)等。

for i in $(seq 1 100); do echo $i; done > list

然后一个简短的脚本来执行复制,等等为列表的每个元素,

for number in `cat list`; do
    symbol="data$number"; #construct string from variable, constant text
    mkdir $symbol; #make the directory you need
    cp -p dataxxx/* $symbol/; #copy your template files
    #now you need to edit each file in directory $symbol/
    for file in `ls $symbol`; do
        sed -i ‘s/dataxxx/$symbol/g’ $file; #rewrite your template files
    done
done

使用sed进行更改-要更改文件中单词的所有实例,命令为

sed -i ‘s/original_word/new_word/g’ file.txt

结尾的"g"告诉sed在全局范围内执行操作。

假设dataxxx位于您的桌面中。现在,只需两个命令即可完成此操作。

mkdir ~/Desktop/data{1..100}
for d in ~/Desktop/data{1..100}; do
  cp -a ~/Desktop/dataxx "$d"
done

将其保存到名为copy.sh的文件中,并通过bash copy.sh运行(已检查ubuntu。不同的linux发行版可以使用不同的过程来运行sh文件,请参阅。)它对我有用。如果有效,请回复。有关更多信息,请参阅使用终端man cp

这是另一个使用seq的程序,包含输入和目录创建的错误检查/验证。您可以通过取消对rm命令的注释来选择是否删除末尾的原始dataxxx目录:

#!/bin/sh
[ -d "$1" ] || {  ## validate source directory given
    printf "error: insufficient input, usage: %s srcdirn" "${0//*//}"
    exit 1
}
for i in $(seq 1 100); do
    newdir="data$i"             ## form new directory name from seq val
    mkdir -p "$newdir" || {     ## create new directory data1 - data100
        printf "error: directory creation failed '%s'n" "$newdir"
        exit 1
    }
    cp -a "$1"/* "$newdir"      ## copy contents of dataxxx to $newdir
done
# rm -f "$1"   ## optionally remove original source directory

最新更新