我有一些文件位于一个目录/home/john我想复制所有带*的文件。文本扩展名从这个目录,并保存为*. Text。备份,同样在同一目录下,即/home/john
是否有一个单一的命令,我可以做到这一点?同样,使用相同的扩展名,是否可以复制具有多个扩展名(例如*)的所有文件?文本,*.doc)作为*.text。bkup,* . doc。分别备份(还是在同一目录下)?
这最好通过Shell循环来完成:
~/tmp$ touch one.text two.text three.doc four.doc
~/tmp$ for FILE in *.text *.doc; do cp ${FILE} ${FILE}.bkup; done
~/tmp$ ls -1
four.doc
four.doc.bkup
one.text
one.text.bkup
three.doc
three.doc.bkup
two.text
two.text.bkup
上面代码中发生的事情是,shell获取所有.text和.doc文件,然后依次循环遍历每个值,将变量FILE赋值给每个值。"do"one_answers"done"之间的代码块对FILE的每个值执行,有效地将每个文件复制到filename. backup .
您可以使用find:
轻松实现这一点find /home/john -iname '*.text' -type f -exec cp {} {}.backup ;
不,没有一个单一/简单的命令可以用标准工具实现这一点
但是你可以写一个像这样的脚本来为你做。
for file in *.text
do
cp -i "${file}" "${file}.bkup"
done
使用-i
选项可以确认每个覆盖操作
我使用了一种迂回的方式来实现这一点。它涉及到一个Perl脚本,并且需要额外的步骤。
步骤1:将所有文本文件的名称复制到一个文本文件中
find -maxdepth 1 -type f -name '*.txt' > file_name1.txt
步骤2:复制复制的文件
cp file_name1.txt file_name2.txt
现在在vi编辑器中打开file_name2.txt,做一个简单的字符串替换。
%s/.text/.text.backup/g
步骤3:将源文件名和目标文件名合并成一个文件,以逗号分隔。
paste -d, file_name1.txt file_name2.txt > file_name.txt
步骤4:运行下面的perl脚本,以获得所需的结果
open(FILE1,"<file_name.txt") or die'file doesnt exist'; #opens a file that has source and destination separated beforhand using commas
chomp(@F1_CONTENTS=(<FILE1>)); # copies the content of the file into an array
close FILE1;
while()
{
foreach $f1 (@F1_CONTENTS)
{
@file_name=split(/,/,$f1); # separates the file content based on commas
print "cp $file_name[0] $file_name[1]n";
system ("cp $file_name[0] $file_name[1]"); # performs the actual copy here
}
last;
}