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

时间:2015-11-25 02:28:21

标签: linux unix sh

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

例如,我有“dataxxx”文件夹,其中包含2个文件。我需要将该文件夹复制到data1,data2,data3,...,data100。其中的文件是简单的文本文件,我需要将所有dataxxx实例替换为文件夹名$ # Go to https://github.com/cheeriojs/cheerio/ and fork it $ git clone https://github.com/Delgan/cheerio/ && cd cheerio # assuming that's your GH username :) $ git remote add pr-base https://github.com/digihaven/cheerio/ $ git fetch pr-base $ git checkout pr-base/master -b 641-appendTo_prependTo $ # work work work $ git add #... $ git commit -m 'Fixed all the things! See #641, fixes #726' $ git push origin 641-appendTo_prependTo $ # Go to your repo and make the PR $ # ... $ # SUCESS! (??!)

3 个答案:

答案 0 :(得分:1)

以下是如何完成任务的第一个示例。请注意,此示例很容易推广到任何符号,而不仅仅是数字{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全局执行操作。

答案 1 :(得分:0)

假设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

答案 2 :(得分:0)

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

#!/bin/sh

[ -d "$1" ] || {  ## validate source directory given
    printf "error: insufficient input, usage: %s srcdir\n" "${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