Как копировать рекурсивно и изменять имена файлов, чтобы быть уникальными

У меня есть большое дерево, содержащее много фотографий на внешнем диске, который был отформатирован одним из типов файловой системы Linux (не помните, какой из них). Он установлен на моем Mac, и я пытаюсь скопировать фотографии, но, похоже, есть файлы с именем «somePic.jpg» и «somePic.JPG». Когда я пытаюсь их скопировать, OSX жалуется, что есть дубликаты имен и завершает работу. Как я могу их скопировать, гарантируя, что имена файлов уникальны? Я не могу просто переименовать любые обманы в исходном дереве, потому что OSX смонтировал только диск.

Я пару раз играл вокруг w / cp, gcp, sed и xargs, но не смог ничего работать.

3 Solutions collect form web for “Как копировать рекурсивно и изменять имена файлов, чтобы быть уникальными”

… за ваш комментарий к вопросу …

pax -rws'/\.JPG$/.CAP&/' /root/of/copied/tree /dest/path 

Если .jpg и .JPG – ваши единственные проблемы, которые должны работать.

Вы также можете добавить примитив p rint к подстановке имен файлов, чтобы получить список всех тех файлов, которые были изменены:

 pax -rws'/\.JPG$/.CAP&/p' /root/of/copied/tree /dest/path 

Насколько я могу судить, pax уже должен быть установлен на OSX-системе, и поэтому это должно быть довольно безвкусным решением в целом.

Если проблемы, в конечном итоге, будут более глубокими, однако, может также вас заинтересовать, что поддержка pax

-i

Интерактивно переименуйте файлы или элементы архива. Для каждого члена архива, соответствующего операнду шаблона или каждому файлу, соответствующему файловому операнду, pax предложит /dev/tty имя файла, его режим файла и время его модификации. Затем pax прочитает строку из /dev/tty . Если эта строка пуста, элемент файла или архива пропускается. Если эта строка состоит из одного периода, элемент файла или архива обрабатывается без изменения его имени. В противном случае его имя заменяется содержимым строки. pax немедленно выйдет с ненулевым статусом выхода, если EOF ( CTRL+D ) встречается при чтении ответа или если /dev/tty невозможно открыть для чтения и записи.

Вот краткий удар:

# for f in $( find yoursourcedirectory -name \*.jpg ) ; do cp ${f} yourtargetdirectory/${f}.CAP1.jpg ; done

тогда

# for f in $( find yoursourcedirectory -name \*.JPG ) ; do cp ${f} yourtargetdirectory/${f}.CAP2.jpg ; done

Это займет все файлы с именем * .jpg в источнике и скопирует их как * .CAP1.jpg и все файлы * .JPG как * .CAP2.jpg

Другим подходом было бы использование diffmerge: https://sourcegear.com/diffmerge/

еще один (если будет много, много файлов, пытающихся использовать одно и то же имя), нужно назначить случайное имя для каждого файла:

# for f in $( find yoursourcedirectory -iname \*.JPG ) ; do cp ${f} yourtargetdirectory/$(dd if=/dev/random count=20 2>&1 /dev/null |md5).jpg ; done

(обратите внимание, что переключатель -iname делает регистр поиска незаметным, поэтому * .JPG и * .jpg оба будут найдены)

Один из способов сделать это, предположив, что у вас есть (1) grep достаточно умный, чтобы читать шаблоны из stdin , (2) достаточно умную оболочку для обработки конструкций <(...) , (3) rename из Unicode::Tussle Perl пакет и (4) набор файлов без символов новой строки в их именах:

 cd /path/to/pics ls -1 | tr AZ az | sort | uniq -d | fgrep -ixf - <(ls -1) | \ rename -n 's/(?=\.[^.]+$)/"_".int(rand(32767))/e' 

Это переименовывает файлы на месте, в файловой системе, чувствительной к регистру. Сначала он показывает вам, что он собирается делать. Если вы довольны результатами, вы можете удалить параметр -n из rename , и команда фактически переименует файлы (на этот раз он ничего не напечатает).

Есть небольшой шанс, что после этого у вас все еще будут конфликты. Вы можете проверить эту команду:

 cd /path/to/pics ls -1 | tr AZ az | sort | uniq -d 

Если он что-то возвращает, вы можете просто запустить команду выше нескольких раз, пока не будет больше дубликатов. Затем вы можете переместить всю группу на свой диск OSX.

  • Readline .inputrc сбрасывает значения по умолчанию с каждой строкой
  • Установите NFS4-экспорт из Ubuntu на Mac OSX 10.11
  • где $ PATH получает свои значения из (osx)?
  • dd копирует больше данных, чем существует в .img?
  • Установка инструментов командной строки Xcode, командной строки
  • Как читать страницу руководства для встроенного bash?
  • OS / X: невозможно выполнить сценарии оболочки - выдает новое окно, которое немедленно выйдет
  • Как можно отключить DYLD_LIBRARY_PATH для запуска процессов?
  • Переименовать каталог на основе даты файла в каталоге
  • Как запустить Google Chrome или Chromium на удаленном сеансе ssh?
  • Завершение zsh не исправимо? (вопросительный знак) в дорожках
  • Interesting Posts

    Файл с zipped с помощью 7za нельзя распаковать с помощью утилиты zip

    Удаление расширения нескольких файлов без использования цикла в Linux

    Эквивалентная команда для “ time“ для использования памяти?

    Зацикливание записей в каталоге bash и сохранение в массив

    sed для поиска вкладки

    grep фиксированная строка в конце строки

    Последовательный порт не работает

    При использовании gnome, как я могу увеличить расстояние между рабочими пространствами

    Как получить помощь для переменных bash из командной строки?

    Debian 8 – Джесси – Сломанные пакеты / Зависимость Ад

    Мониторинг ввода / вывода программы

    Почему я вижу «Не удалось найти tools.jar. Ожидалось найти его в … », когда я запускаю ant (на RHEL 6.6), даже если путь установлен

    Правила IPTable для прозрачного исходящего прокси

    Почему в загрузчике чаще всего написано на ассемблере?

    Что такое эквивалентная команда Linux для команды Windows ipconfig / registerdns?

    Linux и Unix - лучшая ОС в мире.