Если это - что-нибудь как двухтысячный год, некоторые люди были уже затронуты и изменяют программное обеспечение, но большинство разработчиков проигнорирует его до когда-то в 2030-х, вероятно, приблизительно 2035, в который точка, там будет большая работа, сделанная, и кто-либо достаточно взрослый, чтобы знать, что K&R C и еще не слишком старческий внезапно сможет выйти за большое количество денег. Фактический переход покажет много вещей, еще не сделанных, вероятно, ни один все что важный.
В первую очередь, оболочка является globbing '*' для Вас. Любой Escape это с \
или используйте кавычки вокруг *.html
Как так:
find myDir -name "*.html"
или find myDir -name \*.html
Пропустите использование xargs
с find
-exec
переключатель:
find myDir -name "*.html" -exec cp {} ~/otherDir \;
Это работает потому что {}
занимает место файла это find
найденный, и выполняется однажды для каждого соответствия.
Также обратите внимание, что это сгладит копию исходного каталога. Пример:
myDir/a.html
myDir/b/c.html
уступит
otherdir/a.html
otherdir/c.html
mydir/a/a.html
и mydir/b/a.html
кому: otherdir/a.html
и это не полностью очевидно предсказуемо, какой заканчивается скопированный по последнему, который является, вероятно, не чем-то, что Вы хотите...
– Shadur
11.05.2011, 09:42
-exec cp {} ~/debug/ \;
нет -exec cp ~/debug {} \;
поскольку, что должно быть довольно очевидными причинами, после того как Вы думаете об этом...
– Shadur
11.05.2011, 09:43
Таким образом, Вы хотите скопировать весь .html
файлы в некотором исходном каталоге и его подкаталогах, всех к единственному каталогу (т.е. сворачивание иерархии)?
Стандарт POSIX:
find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} +
Отметьте это ~/otherDir
становится параметром 0 к промежуточной оболочке, которая позволяет, чтобы исходные файлы были точно "$@"
. Отъезд целевого каталога вне оболочки имеет дополнительное преимущество, что Вы не столкнетесь с заключением в кавычки проблем, если это будет переменной в родительском сценарии оболочки (-exec sh -c 'cp "$@" "$0"' "$target"
).
Для более старых систем, которые не имеют find … -exec … +
:
find myDir -name '*.html' -type f -exec cp {} ~/otherDir \;
Я Ваша оболочка являюсь ударом ≥4 или zsh:
shopt -s globstar # only for bash, put it in your `.bashrc`
cp myDir/**/*.html ~/otherDir/
shopt -s
(setopt
соответствующая команда в zsh).
– Gilles 'SO- stop being evil'
03.06.2011, 19:58
-type f
оцененный после -name "*.html"
? В то время как a.html является допустимым именем каталога, я не ожидал бы тот. Возможно, -type f
имел бы больше смысла прежде, чем проверить имя файла, но я предполагаю, что редко существует различие в скорости выполнения.
– user unknown
03.06.2011, 20:23
Попробовать
find myDir -name '*.html' -exec cp -t ~/otherdir {} +
Одна проблема с этим подходом состоит в том, что он не создает подкаталогов, таким образом, все файлы вставляются ~/otherDir
и файлы, которые называют тем же, но в различных частях myDir
дерево не становится скопированным.
Если это вызвало бы Вас проблема затем, можно использовать следующее для создания того же дерева каталогов в ~/otherDir
дерево
find myDir -name '*.html' | cpio -pdm ~/otherdir
У меня нет Mac
find myDir -name '*.html' -print | xargs -I {} cp {} ~/otherDir
или если Вы можете
find myDir -name '*.html' -print0 | xargs -0 -I {} cp {} ~/otherDir
поскольку это будет безопасно для файлов с пробелами на имя.
OSX поддерживает-execdir для находки?
find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";"
Гну/находить предлагает использовать-execdir вместо - должностное лицо для большинства случаев.
-execdir
лучше в случае, если каталог перемещен в то время как find
работает, но это, к сожалению, не портативно.
– Gilles 'SO- stop being evil'
03.06.2011, 20:35