我的文件结构如下:
folder1
-file1.a
-file2.b
-file3.c
folder2
-file1.a
-file2.b
folder3
-file1.a
-file2.b
-file3.c
我想只使用.a复制文件并保留树结构:
folder1
-file1.a
folder2
-file2.a
folder3
-file3.a
如何使用bash完成此操作?
答案 0 :(得分:3)
如果你有GNU cp
(linux),你可以:
cp --parent folder*/**/*.a /path/to/destination
或两个管道tar
tar czf - folder*/**/*.a | tar -C /path/to/dest -xvf -
或
find folder* -name \*.a -print | cpio -o | (cd /path/to/dest ; cpio -idv)
或更好,来自@ JonathanLeffler的评论
find folder* -name '*.a' -print | cpio -pvd /path/to/dest
#and with null terminated
find ... -print0 | cpio -p0dv /path/to/dest
**
意思是(来自man bash)
- 匹配任何字符串,包括空字符串。启用globstar shell选项时,* 在路径名扩展上下文中使用,用作单个模式的两个相邻*将匹配所有 文件和零个或多个目录和子目录。如果后跟一个/,两个相邻的*将会 仅匹配目录和子目录。
globstar
(默认开启)
<强> globstar 强> 如果设置,路径名扩展上下文中使用的模式**将匹配所有文件和零或 更多目录和子目录。如果模式后跟一个/,只有目录和 子目录匹配。
答案 1 :(得分:0)
一种方法是使用您需要的文件创建一个tar文件...然后在任何您想要的地方提取该tar ...例如。以下
$ tar -cvf allfiles.tar `find . -name "*.a" -print`
$ cp allfiles.tar /newdirectory
$ cd /newdirectory
$ tar -xvf allfiles.tar
另一种方式是......
# below command will find all files with .a extension and then
# copy them to the newdir directory with folder structure.
$ cp --parents `find . -name "*.a" -print` newdir
答案 2 :(得分:0)
您可以使用for
循环:
for f in folder{1..3}; do mkdir -p "dest/$f" && cp "src/$f/file1.a" "dest/$f"; done
例如:
$ ls src/*
src/folder1:
file1.a file2.b file3.c
src/folder2:
file1.a file2.b file3.c
src/folder3:
file1.a file2.b file3.c
$ for f in folder{1..3}; do mkdir -p "dest/$f" && cp "src/$f/file1.a" "dest/$f"; done
$ ls dest/*
dest/folder1:
file1.a
dest/folder2:
file1.a
dest/folder3:
file1.a