48

在 Linux 上是否有单行命令/脚本可以将一个文件复制到多个文件?

cp file1 file2 file3

将前两个文件复制到第三个文件中。有没有办法将第一个文件复制到其余文件中?

4

11 回答 11

77

cp file1 file2 ; cp file1 file3

算作“单行命令/脚本”吗?怎么样

for file in file2 file3 ; do cp file1 "$file" ; done

?

或者,对于“复制”的稍微宽松的感觉:

tee <file1 file2 file3 >/dev/null
于 2012-03-03T22:49:54.037 回答
10

只是为了好玩,如果您需要大量文件:

tee <sourcefile.jpg targetfiles{01-50}.jpg >/dev/null-开尔文 2 月 12 日 19:52

但是有一点笔误。应该:

tee <sourcefile.jpg targetfiles{01..50}.jpg >/dev/null

如上所述,这不会复制权限。

于 2016-08-21T12:08:25.893 回答
7

您可以使用bash 大括号扩展的范围来改进/简化for复制的方法(由@ruakh 回答):

for f in file{1..10}; do cp file $f; done

这复制filefile1, file2, ..., file10.

资源检查:

于 2018-04-11T08:28:54.287 回答
3
for FILE in "file2" "file3"; do cp file1 $FILE; done
于 2012-03-03T22:51:12.430 回答
2

您可以使用shift

file=$1
shift
for dest in "$@" ; do
    cp -r $file $dest
done
于 2012-03-04T06:54:46.850 回答
2

cat file1 | tee file2 | tee file3 | tee file4 | tee file5 >/dev/null

于 2018-05-22T02:44:36.013 回答
1

使用类似下面的东西。它适用于 zsh。

cat 文件 > firstCopy > secondCopy > thirdCopy

或者

cat file > {1..100} - 用于带有数字的文件名。

这对小文件很有用。

对于较大的文件,您应该使用前面提到的 cp 脚本。

于 2015-08-28T09:37:46.000 回答
1

我建议基于该脚本创建一个通用脚本和一个函数 ( empty-files ),以清空任意数量的目标文件。

将脚本命名为copy-from-one-to-many并将其放在您的 PATH 中。

#!/bin/bash -e
#  _ _____     
# | |___ /_  __  
# | | |_ \ \/ /  Lex Sheehan (l3x)
# | |___) >  <   https://github.com/l3x
# |_|____/_/\_\  
#
# Copy the contents of one file to many other files.

source=$1
shift
for dest in "$@"; do
    cp $source $dest
done

exit

笔记

以上shift从参数列表()中删除了第一个元素(源文件路径"$@")。

如何清空多个文件的示例:

使用以下内容创建 file1、file2、file3、file4 和 file5:

for f in file{1..5}; do echo $f > "$f"; done

清空许多文件:

copy-from-one-to-many /dev/null file1 file2 file3 file4 file5

清空许多文件更容易:

# Create files with content again
for f in file{1..5}; do echo $f > "$f"; done 

copy-from-one-to-many /dev/null file{1..5}

基于从一对多复制创建empty_files函数

function empty-files()
{
    copy-from-one-to-many /dev/null "$@"
}

示例用法

# Create files with content again
for f in file{1..5}; do echo $f > "$f"; done 
# Show contents of one of the files
echo -e "file3:\n $(cat file3)"

empty_files file{1..5}
# Show that the selected file no longer has contents
echo -e "file3:\n $(cat file3)"

不要只是窃取代码。改进它; 用例子记录它并分享它。- l3x


这是一个版本,它将在每个 cp 命令前加上sudo

#!/bin/bash -e
# Filename: copy-from-one-to-may
#  _ _____     
# | |___ /_  __  
# | | |_ \ \/ /  Lex Sheehan (l3x)
# | |___) >  <   https://github.com/l3x
# |_|____/_/\_\  
#
# Copy the contents of one file to many other files.
# Pass --sudo if you want each cp to be perfomed with sudo
# Ex: copy-from-one-to-many $(mktemp) /tmp/a /tmp/b /tmp/c --sudo

if [[ "$*" == *--sudo* ]]; then
    maybe_use_sudo=sudo
fi

source=$1
shift
for dest in "$@"; do
    if [ $dest != '--sudo' ]; then
      $maybe_use_sudo cp $source $dest
    fi
done

exit
于 2021-05-21T03:28:21.937 回答
0

我能想到的最简单/最快的解决方案是 for 循环:

for target in file2 file3 do; cp file1 "$target"; done

一个肮脏的黑客将是以下(我强烈建议不要这样做,并且无论如何只能在 bash 中使用):

eval 'cp file1 '{file2,file3}';'
于 2012-03-03T22:50:31.457 回答
0

您可以为此使用标准脚本命令:

重击:

 for i in file2 file3 ; do cp file1 $i ; done
于 2012-03-03T22:50:34.697 回答
0

使用最快的cp 操作

seq 1 10 | xargs -P 0 -I xxx cp file file-xxx

它的意思是

  • seq 1 10从 1 数到 10
  • |管它xargs
  • -P 0并行进行 - 根据需要进行
  • -I xxx每个输入的名称xargs接收
  • cp file file-xxx表示将文件复制到文件 1、文件 2 等

如果文件名不同,这里是其他解决方案。
首先有要创建的文件列表。例如

one
two
three
four
five

其次将此列表保存在磁盘上并xargs像以前一样读取列表,但不使用seq.

xargs -P 0 -I xxx cp file xxx  < list

这意味着并行 5 个复制操作:

cp file one  
cp file two  
cp file three  
cp file four  
cp file five  

这是xargs幕后花絮(5个叉子

 3833 pts/0    Ss     0:00 bash
15954 pts/0           0:00  \_ xargs -P 0 -I xxx cp file xxx < list
15955 pts/0           0:00      \_ cp file one
15956 pts/0           0:00      \_ cp file two
15957 pts/0           0:00      \_ cp file three
15958 pts/0           0:00      \_ cp file four
15959 pts/0           0:00      \_ cp file five
于 2021-05-21T04:49:11.920 回答