我在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