我想将所有.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
跳过使用xargs
withfind
的-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。