这是我必须做的:找到目录 src
(或其子目录)中的所有文件,并在它们的名称中包含 str
并将它们复制到 dest
保留子目录结构。例如,我有包含 foo.txt
的目录 dir1
和还包含 foo.txt
的子目录 subdir
.运行我的脚本后(使用 str=txt
和 dest=dir2
)dir2
应该包含 foo.txt
和 子目录/foo.txt
。到目前为止,我想出了这段代码:
while read -r line; do
cp --parents $line $dest
done <<< "$(find $src -name "*$str*")"
除了它在 dir2
中创建 dir1
并且所需的文件在 dir2/dir1
中之外,它几乎完成了工作。我还尝试使用 find 的 -exec
选项来执行此操作,但没有获得更好的结果。
最佳答案
IIUC,这可以通过 find ... -exec
来完成。假设我们有以下目录:
$ tree
.
└── src
├── dir1
│ └── yet_another_file_src
└── file_src
2 directories, 2 files
我们可以像这样将所有包含*src*
的文件复制到/tmp/copy-here
:
$ find . -type f -name "*src*" -exec sh -c 'echo mkdir -p /tmp/copy-here/$(dirname {})' \; -exec sh -c 'echo cp {} /tmp/copy-here/$(dirname {})' \;
mkdir -p /tmp/copy-here/./src
cp ./src/file_src /tmp/copy-here/./src
mkdir -p /tmp/copy-here/./src/dir1
cp ./src/dir1/yet_another_file_src /tmp/copy-here/./src/dir1
请注意,我使用了 echo
而不是真正运行此命令 -
阅读输出并确保这是你想要的
达到。如果您确定这就是您想要的,请删除
echo
像这样:
$ find . -type f -name "*src*" -exec sh -c 'mkdir -p /tmp/copy-here/$(dirname {})' \; -exec sh -c 'cp {} /tmp/copy-here/$(dirname {})' \;
$ tree /tmp/copy-here
/tmp/copy-here
└── src
├── dir1
│ └── yet_another_file_src
└── file_src
2 directories, 2 files
编辑:
当然,您始终可以使用rsync
:
$ rsync -avz --include "*/" --include="*src*" --exclude="*" "$PWD" /tmp/copy-here
关于linux - 复制文件并保留目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044456/