如何通过linux / bash中的通配符复制?

时间:2016-05-29 01:46:22

标签: linux bash scp cp

这是我想要做的 - 假设一个源目录:

/xyz/2/file.txt
/xyz/2/crapfile.txt
/xyz/3/file.txt
/xyz/3/crapfile.txt

我想将file.txt复制到以下目录中:

/z/2
/z/3

我喜欢这样做,但这不起作用:

cp -r /xyz/*/file.txt /z/*/

避免单独复制内容 - 我可以使用以下内容进行复制:

cp -r /xyz/2/file.txt /z/2/
cp -r /xyz/3/file.txt /z/3/

4 个答案:

答案 0 :(得分:1)

此命令从 if (grade == 'A' || grade == 'a'){ // ... } else if (grade == 'B' || grade == 'b' || grade == 'C' || grade == 'c'){ // ... } // ... 复制到xyz,不包括名为z的所有文件:

crapfile.txt

使用rsync -a --exclude=crapfile.txt xyz/ z (详细)选项,我们可以看到其正在进行的工作:

-v

如您所见,$ rsync -va --exclude=crapfile.txt xyz/ z sending incremental file list ./ 2/ 2/file.txt 3/ 3/file.txt 已被复制,但已跳过file.txt

crapfile.txt是一个非常强大的实用程序,有很多选项。有关详细信息,请参阅网络上的rsync或任何rsync tutorials

答案 1 :(得分:0)

使用for循环ls

for I in `ls /xyz`; do mkdir /z/$I; cp -r /xyz/$I/file.txt /z/$I/ ; done

(或者如果/ z / 2和/ z / 3已经存在跳过mkdir!)

答案 2 :(得分:0)

您可以执行与以下内容类似的操作,而不是使用外卡:

for x in $(ls /xyz) 
do
mkdir /z/$x
cp /xyz/$x/file.txt /z/$x/
done

如果z下的文件夹尚不存在,否则删除上面的mkdir行

答案 3 :(得分:0)

根据我对这个问题的理解,下面应该这样做:

[za]$ cp -rv xyz/{dir_1/,dir_2}/*  target_dir/
`xyz/dir_1//file3_dir1.txt' -> `target_dir/file3_dir1.txt'
`xyz/dir_1//file4_dir1.txt' -> `target_dir/file4_dir1.txt'
`xyz/dir_2/file1.txt' -> `target_dir/file1.txt'
`xyz/dir_2/file2.txt' -> `target_dir/file2.txt'
`xyz/dir_2/file3.txt' -> `target_dir/file3.txt'
`xyz/dir_2/file4.txt' -> `target_dir/file4.txt'

[za]$ cp -rv xyz/{dir_1/,dir_2}/*.txt  target_dir/
`xyz/dir_1//file3_dir1.txt' -> `target_dir/file3_dir1.txt'
`xyz/dir_1//file4_dir1.txt' -> `target_dir/file4_dir1.txt'
`xyz/dir_2/file1.txt' -> `target_dir/file1.txt'
`xyz/dir_2/file2.txt' -> `target_dir/file2.txt'
`xyz/dir_2/file3.txt' -> `target_dir/file3.txt'
`xyz/dir_2/file4.txt' -> `target_dir/file4.txt'



other ways depending on what you are trying to achive. 

1)
[za temp_dir]$ cp -rv xyz/* target_dir/
`xyz/dir_1' -> `target_dir/dir_1'
`xyz/dir_1/file3_dir1.txt' -> `target_dir/dir_1/file3_dir1.txt'
`xyz/dir_1/file4_dir1.txt' -> `target_dir/dir_1/file4_dir1.txt'
`xyz/dir_2' -> `target_dir/dir_2'
`xyz/dir_2/file1.txt' -> `target_dir/dir_2/file1.txt'
`xyz/dir_2/file2.txt' -> `target_dir/dir_2/file2.txt'
`xyz/dir_2/file3.txt' -> `target_dir/dir_2/file3.txt'
`xyz/dir_2/file4.txt' -> `target_dir/dir_2/file4.txt'

2)
[za temp_dir]$ for x in $(find . -type f) ; do cp -v $x target_dir/ ; done 
`./target_dir/dir_1/file3_dir1.txt' -> `target_dir/file3_dir1.txt'
`./target_dir/dir_1/file4_dir1.txt' -> `target_dir/file4_dir1.txt'
`./target_dir/dir_2/file1.txt' -> `target_dir/file1.txt'
`./target_dir/dir_2/file2.txt' -> `target_dir/file2.txt'
`./target_dir/dir_2/file3.txt' -> `target_dir/file3.txt'
`./target_dir/dir_2/file4.txt' -> `target_dir/file4.txt'
`./xyz/dir_1/file3_dir1.txt' -> `target_dir/file3_dir1.txt'
`./xyz/dir_1/file4_dir1.txt' -> `target_dir/file4_dir1.txt'
`./xyz/dir_2/file1.txt' -> `target_dir/file1.txt'
`./xyz/dir_2/file2.txt' -> `target_dir/file2.txt'
`./xyz/dir_2/file3.txt' -> `target_dir/file3.txt'
`./xyz/dir_2/file4.txt' -> `target_dir/file4.txt'


3)      
[za temp_dir]$ rsync -rav xyz/* target_dir/
sending incremental file list
dir_1/
dir_1/file3_dir1.txt
dir_1/file4_dir1.txt
dir_2/
dir_2/file1.txt
dir_2/file2.txt
dir_2/file3.txt
dir_2/file4.txt

sent 414 bytes  received 134 bytes  1096.00 bytes/sec
total size is 0  speedup is 0.00
[za temp_dir]$ 


4)
[za]$  find xyz/ | while read ; do cp -v $REPLY target_dir/ ; done 
cp: omitting directory `xyz/'
cp: omitting directory `xyz/dir_1'
`xyz/dir_1/file3_dir1.txt' -> `target_dir/file3_dir1.txt'
`xyz/dir_1/file4_dir1.txt' -> `target_dir/file4_dir1.txt'
cp: omitting directory `xyz/dir_2'
`xyz/dir_2/file1.txt' -> `target_dir/file1.txt'
`xyz/dir_2/file2.txt' -> `target_dir/file2.txt'
`xyz/dir_2/file3.txt' -> `target_dir/file3.txt'
`xyz/dir_2/file4.txt' -> `target_dir/file4.txt'


sent 414 bytes  received 134 bytes  1096.00 bytes/sec
total size is 0  speedup is 0.00