通过特定文件夹和扩展名递归复制

时间:2017-05-03 18:08:37

标签: linux bash macos unix

我希望从文件夹中递归复制,并在文件夹名称和特定类型中包含特定字符串。

./test/one/Print\{space} 100/ /* note: there is a space between Print an the number */
./test/one/Print\{space} 200/
./test/one/Internet\{space} 100/
./test/two/Print\{space} 100/
./test/two/Print\{space} 200/
./test/two/Internet\{space} 100/

./destinationfolder

现在我想只复制带有jpg扩展名的文件和那些位于“Print”文件夹中的文件。

如何在控制台上执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以使用Bash的globstar功能来实现此目的:

cd _your_directory
shopt -s globstar nullglob
cp **/Print*/*.jpg ./destinationdir

适用于名称中包含空格的文件或目录。

来自Bash documentation

  

globstar

     

如果设置,文件名扩展上下文中使用的模式“**”将匹配所有文件以及零个或多个目录和子目录。   如果模式后跟'/',则只有目录和子目录匹配。

答案 1 :(得分:1)

您可以将GNU find与某些bash操作结合起来,以实现您的目标,

find . -type d -name "Print*" -exec sh -c 'x=$1; cp -v "$x"/*.jpg ./destinationfolder/' sh {} \;

应该为你做的伎俩。我们的想法是使用glob模式Print*来获取包含Print的文件夹的名称,然后运行shell -exec来复制扩展名为*.jpg的文件。文件夹名称x(此处引用"$x"的双引号可以防止如果名称​​包含空格而变得丑陋)并将其移至目标文件夹。

答案 2 :(得分:0)

当文件夹名称包含“空格”时,您可以使用引号,以便可以将其视为带空格的名称..

要从“print 200”目录中复制 .jpg文件,可以使用               cp -Rp“print 200”/ .jpg destinationfolder /