如何在linux中一次复制多个文件?这些文件的源位置和目标位置为同一目录

  • 本文关键字:文件 位置 目标 linux 复制 一次 linux unix
  • 更新时间 :
  • 英文 :


我有一些文件位于一个目录/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;
}

最新更新