如何将一个目录下的子文件夹中的所有文件复制到另一个目录?我遇到了麻烦,因为某些最终文件位于比其他文件更多的文件夹中。
我知道有人使用 find 来查找文件名以 .txt 结尾的特定文件,但我的文件没有文件类型
我目前有 cp -r cs/cs/201*sp/. all/
问题是,我有两个文件夹包含需要复制的文件,它们是 201*sp/ 的子集
目前,它会复制这两个文件夹中没有的所有正确项目,但是当我需要它仅复制其内容时,它会复制这些文件夹本身。
答案1
查找 cs/cs/201*sp/-type f-exec cp {} all/\;
答案2
如果我理解您所需要的是一种方法来查看一个文件夹及其所有子文件夹,并将找到的所有文件复制到不同的“目标”文件夹中,而无需在“目标”文件夹中创建任何子文件夹。
因此如果你有这样的文件集:
folderA/file1
folderA/subfolderC/file2
folderA/subfolderC/subD/file3
folderA/subfolderC/subE/file4
folderB/subfolderF/file5
folderB/subfolderG/subH/file6
folderB/subfolderG/subI/file7
您正在将文件复制到文件夹"../destfolder"
。然后,复制文件后,"../destfolder"
将包含:
../destfolder/file1
../destfolder/file2
../destfolder/file3
../destfolder/file4
../destfolder/file5
../destfolder/file6
../destfolder/file7
和"../destfolder"
将包含没有任何来自的子文件夹"folderA"
或者"folderB"
。
您可以通过更改为要从中复制文件的目录来执行此操作,然后从命令提示符运行此命令:
d="../destfolder";for f in $(find -type f -exec echo {} \;); do b=$(echo $f|sed -r 's!^.*/([^/]+)!\1!'); echo cp -p "$f" "$d/$b" ;done
在“运行”此命令之前,您需要将实际目标文件夹替换为"../destfolder"
这将显示以下列表cp
命令,但实际上不会复制任何文件。它应该看起来像这样:
cp -p folderA/file1 ../destfolder/file1
cp -p folderA/subfolderC/file2 ../destfolder/file2
cp -p folderA/subfolderC/subD/file3 ../destfolder/file3
cp -p folderA/subfolderC/subE/file4 ../destfolder/file4
cp -p folderB/subfolderF/file5 ../destfolder/file5
cp -p folderB/subfolderG/subH/file6 ../destfolder/file6
cp -p folderB/subfolderG/subI/file7 ../destfolder/file7
一旦您确信正确的文件将被复制,您可以再次运行该命令,但删除"echo"
从命令的一部分来看:"echo cp -p..."
因此复制文件的命令将如下所示:
d="../destfolder";for f in $(find -type f -exec echo {} \;); do b=$(echo $f|sed -r 's!^.*/([^/]+)!\1!'); cp -p "$f" "$d/$b" ;done
请记住,在“运行”此命令之前,您需要将实际目标文件夹替换为"../destfolder"
如果你想将其作为 shell 脚本,它看起来应该像这样:
#!/bin/sh
d="../destfolder"
for f in $(find -type f -exec echo {} \;); do
b=$(echo $f|sed -r 's!^.*/([^/]+)!\1!')
echo cp -p "$f" "$d/$b"
done
如果这不是您所需要的,请告诉我,我会再看一下。