Ubuntu - как копировать файлы и папки, содержащие специальные символы

У меня есть файловая система, смонтированная только для чтения, которая имеет много файлов со специальными символами, такими как &, ( а также ", Я хотел бы скопировать рекурсивно все файлы и папки на внешний том exFat, используя cp -R но когда я пытаюсь, я получаю много ошибок, которые выглядят так:

cp: cannot create regular file ‘/media/How About Better Parents?.pdf’: No such file or directory

Есть ли способ скопировать эти имена файлов, которые содержат действительные, но специальные символы?

2 ответа

Решение

Вы можете сделать это поэтапно, создав список файлов и новое имя для каждого. Возможно, вам придется сначала создать целевые каталоги. Если структура каталогов относительно плоская, вы можете сделать это вручную с помощью mkdir -p path, Если существует много каталогов, но они не содержат пробелов или недопустимых целевых символов, которые вы можете использовать (скажем, из / dvd в / media)

cd /media ; ( cd /dvd ; find . -type d ) | xargs mkdir -p

Это помещает вас в целевой каталог (готов к mkdir), а затем перечисляет все каталоги ниже исходного каталога, отправляя их mkdir, Вы можете быть в состоянии использовать find вариант -print0 вместе с xargs вариант -0 если вам нужны пробелы в именах каталогов.

Тогда используйте find создать список файлов для копирования, скажем, с

cd /dvd ; find . -type f | sed 's/\(.*\)/cp "\1" "\1"/' > /tmp/copy.sh

Затем отредактируйте файл /tmp/copy.sh замена всех недопустимых символов в целевых именах. Для каждого имени файла sed вставки команд cp перед ним, затем имя файла внутри двойных кавычек (источник) и имя файла внутри двойных кавычек снова (цель). Как только у вас получится это выглядеть приемлемо copy.sh исполняем и запускаем его.

Отказ от ответственности: как всегда возможно скопировать файлы в неправильное место, заполнить файловую систему и т. Д., Поэтому попробуйте несколько команд вручную и проверьте результат перед запуском всей их массы. Вы можете проверить xargs mkdir командовать, пытаясь xargs echo mkdir Сначала посмотреть, что он будет делать.

Вам придется использовать файловую систему, отличную от exFAT. Согласно статье в Википедии, допустимые символы в именах файлов:

Юникод UTF-16 кроме

  • От U+0000 (NUL) до U+001F (США)
  • / (Слэш)
  • \ (Обратный слэш)
  • : (двоеточие)
  • * (Звездочка)
  • ? (Вопросительный знак)
  • " (Цитата)
  • < (меньше, чем)
  • > (лучше чем)
  • | (Труба)
Другие вопросы по тегам