4

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

Предположим, это файл some.txt для копирования из folder1 в folder2

cp -r some.txt /folder2

Я могу скопировать этот файл, но если имя файла начинается с $ like $somefile.class то я не могу скопировать файл, просто получаю ошибку «файл не существует»

cp -r $somefile.class /folder2

4 ответа4

15

Прежде всего, вам не нужен флаг -r (от man cp):

-R , -r , --recursive
        рекурсивно копировать каталоги

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

cp '$somefile.class' /folder2
cp \$somefile.class /folder2

Кроме того, вы можете использовать функцию расширения glob оболочки, чтобы скопировать файл:

cp ?somefile.class /folder2
cp *somefile.class /folder2

? соответствует "любой отдельный символ" и * соответствует "0 или более символов". Таким образом, использование этих глобусов позволит вам скопировать целевой файл, не беспокоясь об имени. Однако имейте в виду, что вы должны использовать это осторожно и убедитесь, что глобусы соответствуют только файлу, который вы хотите скопировать. Например, те, что я использовал, также будут соответствовать Lsomefile.class .

9

Вы должны экранировать любой специальный символ с помощью обратной косой черты \

cp -r \$somefile.class /folder2

Узнайте больше о побеге здесь:

Какие символы мне нужно экранировать при использовании sed в скрипте sh?

8

Символ $ используется для обозначения переменной оболочки. Если ваш файл действительно начинается с $ вы должны использовать одинарные кавычки, чтобы оболочка не пыталась оценить его как переменную:

cp -r '$somefile.class' /folder2
0

Ни одно из этих решений не сработало для меня в том случае, если специальный символ - был впереди. Единственная вещь, которая работала для меня в этом случае, заключалась в том, чтобы поместить текущую директорию впереди так:

cp -r './-somefile.class' /folder2

Хотя это не знак $ , это специальный символ, и он может помочь некоторым другим людям. Другие решения не работали, например, ставили \ before или ставили одинарный или двойной акцент на имени файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .