如何将目录树中的所有 HTML 文件复制到单个目录

如何将目录树中的所有 HTML 文件复制到单个目录

我想将所有.html文件myDir及其子目录复制到~/otherDir.这是我尝试过的,但它不起作用:

$ find myDir -name *.html -print | xargs -0 cp ~/otherDir
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

答案1

首先,shell 正在为您匹配“*”。要么使用转义符\,要么使用引号*.html

就像这样:

find myDir -name "*.html"或者find myDir -name \*.html

跳过使用xargswithfind-exec开关:

find myDir -name "*.html" -exec cp {} ~/otherDir \;

这是有效的,因为{}它取代了找到的文件find,并且为每个匹配执行一次。

另请注意,这将展平源目录的副本。例子:

myDir/a.html
myDir/b/c.html

将产生

otherdir/a.html
otherdir/c.html

答案2

那么您想将.html某个源目录及其子目录中的所有文件复制到一个目录中(即折叠层次结构)吗?

POSIX标准:

find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} +

请注意,~/otherDir成为中间 shell 的参数 0,这使得源文件精确"$@"。将目标目录留在 shell 之外还有一个额外的优点,即如果目标目录是父 shell 脚本 ( ) 中的变量,则不会遇到引用问题-exec sh -c 'cp "$@" "$0"' "$target"

对于没有的旧系统find … -exec … +

find myDir -name '*.html' -type f -exec cp {} ~/otherDir \;

我你的 shell 是 bash ≥4 或 zsh:

shopt -s globstar  # only for bash, put it in your `.bashrc`
cp myDir/**/*.html ~/otherDir/

答案3

find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir

答案4

OSX 是否支持 -execdir 进行查找?

 find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";"

Gnu/find 建议在大多数情况下使用 -execdir 而不是 -exec。

相关内容