仅使用部分文件移动目录树

时间:2014-09-01 20:39:30

标签: bash unix cp

我的文件结构如下:

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完成此操作?

3 个答案:

答案 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