Как скопировать все файлы HTML от дерева каталогов до единственного каталога

Если это - что-нибудь как двухтысячный год, некоторые люди были уже затронуты и изменяют программное обеспечение, но большинство разработчиков проигнорирует его до когда-то в 2030-х, вероятно, приблизительно 2035, в который точка, там будет большая работа, сделанная, и кто-либо достаточно взрослый, чтобы знать, что K&R C и еще не слишком старческий внезапно сможет выйти за большое количество денег. Фактический переход покажет много вещей, еще не сделанных, вероятно, ни один все что важный.

7
28.03.2017, 02:36
6 ответов

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

3
27.01.2020, 20:13
  • 1
    J не находится у гну xargs (4.4.2) –  simpatico 03.06.2011, 00:29
  • 2
    @simpatico: это - расширение BSD, позволяя передающий несколько элементов, даже когда существуют последующие аргументы. Нет никакого GNU эквивалентного AFAIK. –  Gilles 'SO- stop being evil' 03.06.2011, 20:38

В первую очередь, оболочка является 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
12
27.01.2020, 20:13
  • 1
    на Mac, у меня нет-t, но $, находит, что MR - называет "*.html" - исполнительное CP ~ / отладка {} \; печать: "CP:/Users/simpatico/debug является каталогом (не скопированный)". для каждого HTML файл –  simpatico 10.05.2011, 23:03
  • 2
    О, Вы не упоминали это в своем вопросе. Другим, вероятно, было бы полезно, если Вы могли бы отметить свой вопрос с "osx". Можно все еще сделать это с - должностное лицо - я отредактирую свой ответ. ре –  Miles Strombach 10.05.2011, 23:20
  • 3
    Хуже, это также скопирует обоих mydir/a/a.html и mydir/b/a.html кому: otherdir/a.html и это не полностью очевидно предсказуемо, какой заканчивается скопированный по последнему, который является, вероятно, не чем-то, что Вы хотите... –  Shadur 11.05.2011, 09:42
  • 4
    @simpatico, Вы поняли порядок превратно. Это -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/
4
27.01.2020, 20:13
  • 1
    setopt globstar не работает над ударом 4.2 и на Mac и на Linux. –  simpatico 03.06.2011, 19:42
  • 2
    @simpatico: Извините, это shopt -s (setopt соответствующая команда в zsh). –  Gilles 'SO- stop being evil' 03.06.2011, 19:58
  • 3
    Не -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

поскольку это будет безопасно для файлов с пробелами на имя.

2
27.01.2020, 20:13
  • 1
    @lain - Вы замечали, что мой Mac ограничил CP w/o-t? Я на самом деле намереваюсь не скопировать структуру, таким образом, cmd был бы идеален, если бы это работало, но запись, что cmd w/o-t не добивается цели (я все еще распечатал использование). –  simpatico 10.05.2011, 22:59
  • 2
    нет никакого "-t", включают команду "CP" в Индивидуалистах (по крайней мере), таким образом, это - решение GNU/Linux. –  Denis Barmenkov 10.05.2016, 19:29
  • 3
    @DenisBarmenkov я полагаю, что обратился к этому приблизительно половина пути вниз мой ответ. –   10.05.2016, 23:43

OSX поддерживает-execdir для находки?

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

Гну/находить предлагает использовать-execdir вместо - должностное лицо для большинства случаев.

2
27.01.2020, 20:13
  • 1
    Это делает. Также - все (достаточно недавний) BSDs. -execdir лучше в случае, если каталог перемещен в то время как find работает, но это, к сожалению, не портативно. –  Gilles 'SO- stop being evil' 03.06.2011, 20:35
ls myDir/*.html | xargs -I {} cp {} ~/otherDir
0
27.01.2020, 20:13

Теги

Похожие вопросы