如何在 linux/bash 中通过通配符进行复制?
How to copy via wild card in linux/bash?
这是我正在尝试做的 - 假设一个源目录:
/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/
使用 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
!)
除了使用通配符,您还可以执行类似以下操作:
for x in $(ls /xyz)
do
mkdir /z/$x
cp /xyz/$x/file.txt /z/$x/
done
如果z下的文件夹不存在,否则删除上面的mkdir行
此命令从 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
是一个非常强大的实用程序,有很多选项。有关详细信息,请参阅 man rsync
或网络上的任何 rsync
tutorials。
根据我对问题的理解,下面应该这样做:
[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
这是我正在尝试做的 - 假设一个源目录:
/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/
使用 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
!)
除了使用通配符,您还可以执行类似以下操作:
for x in $(ls /xyz)
do
mkdir /z/$x
cp /xyz/$x/file.txt /z/$x/
done
如果z下的文件夹不存在,否则删除上面的mkdir行
此命令从 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
是一个非常强大的实用程序,有很多选项。有关详细信息,请参阅 man rsync
或网络上的任何 rsync
tutorials。
根据我对问题的理解,下面应该这样做:
[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