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 (США)
/
(Слэш)\
(Обратный слэш):
(двоеточие)*
(Звездочка)?
(Вопросительный знак)"
(Цитата)<
(меньше, чем)>
(лучше чем)|
(Труба)