Копирование рекурсивно файлов с пробелами

Проанализируйте их в два отдельных набора данных с любой программой, которую Вы предпочитаете. Я использовал бы язык Common LISP и сохранил бы каждый файл конфигурации как вложенный список списков.

И затем используйте инструменты языка, чтобы сделать слияние/исправление/объединение/разность множеств/и т.д. На высоком уровне, для одной разности стороны, код мог бы быть похожим:

(union
  (vals A :keys 'all)
  (vals B
    :keys  
    (set-difference
      (keys B)
      (keys A))))

И затем выпишите получающийся набор данных в файл.

3
17.11.2018, 03:19
2 ответа

Замена команды (`...` или $(...)) разделяется на новой строке, символе табуляции и пробеле (не только новая строка), и поколение имени файла (globbing) выполняется на каждом слове, получающемся из того разделения. Это - split+glob оператор. Вы могли улучшить вещи путем установки $IFS к новой строке и отключают globbing, но здесь, лучше всего должен записать этому надлежащий путь:

find . -name "*.jpg" -type f -exec sh -c '
  for i do
    cp "$i" "${i%.*}-fanart.jpg"
  done' sh {} +

Вы могли также использовать pax для этого:

pax -rws'/\.jpg$/-fanart&/' -s'/.*//' . .

Или zshzmv:

autoload zmv
zmv -QC '(**/)(*)(.jpg)(D.)' '$1$2-fanart$3'
3
27.01.2020, 21:16

Расширение Word выполняется во время расширения неупомянутых замен команды, которое является, почему это не работает.

Если у Вас есть bash4 +, просто используйте globstar:

shopt -s globstar
for file in **/*.jpg; do
    cp -- "$file" "${file%.*}-fanart.jpg"
done
2
27.01.2020, 21:16
  • 1
    Это предполагает, что нет никакой символьной ссылки на каталоги там. Если Вы собираетесь использовать **/ лучше всего должен использовать zsh или ksh93 которые не имеют проблемы. –  Stéphane Chazelas 21.01.2014, 09:14
  • 2
    @StephaneChazelas, Пересекающий символьные ссылки на каталоги, не универсально нежелателен (хотя я соглашаюсь, это не идеально во многих ситуациях). Я все еще стремлюсь там, чтобы быть опцией отключить рекурсию в 4,3. –  Chris Down 21.01.2014, 09:51
  • 3
    , который я согласовываю, делает **/ не следуют (как в zsh, ksh93 или tcsh) и сделайте "после символьных ссылок" опция, было бы лучше. Однако опции а-ля shglob хороши, но иногда добавляют больше проблем, чем они решают. Лучше включить неожиданное поведение на шарик, чем глобально. Используя ***/ как в zsh или tcsh было бы лучше. Наличие globbing спецификаторы для включения noglob, nullglob, nocaseglob, failglob... на шарик как в zsh также было бы намного лучше. –  Stéphane Chazelas 21.01.2014, 12:30
  • 4
    @StephaneChazelas, Рассматривающий, сколько времени удар 4 отсутствовал теперь, я высоко, сомневается, что Chet был бы готов повредить назад совместимость. *** было бы разумно, иначе. –  Chris Down 21.01.2014, 12:43
  • 5
    Chet сделал намного хуже назад совместимость, повреждающаяся прежде (например, для выравнивания =~ с ksh93). Изменение **/ более вероятно, исправит сценарии, чем повреждают их. GNU grep повредился (десятилетие долго) обратная совместимость путем создания -r остановка следует за символьными ссылками в какой-то момент. –  Stéphane Chazelas 21.01.2014, 13:12

Теги

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