Когда я использую copy *.txt somefolder\
система, кажется, копирует все *.txt~
файлы также, который не является тем, что я хочу. Подобное тот же эффект видно с dir
:
C:\Users\Paul\Documents\Programs\Proffy>dir *.txt
Volume in drive C is Vista
Volume Serial Number is EC23-AD6B
Directory of C:\Users\Paul\Documents\Programs\Proffy
29/11/2008 13:54 35,821 COPYING.txt
31/10/2009 21:54 1,644 INSTRUCTIONS.txt
06/06/2009 15:57 1,393 INSTRUCTIONS.txt~
04/01/2009 11:59 116 Notes.txt
19/04/2009 16:53 134 README.txt
04/01/2009 12:42 132 README.txt~
31/10/2009 21:30 197 TODO.txt
31/10/2009 19:10 414 TODO.txt~
8 File(s) 39,851 bytes
0 Dir(s) 41,938,862,080 bytes free
C:\Users\Paul\Documents\Programs\Proffy>
Как я могу добраться dir
и copy
только управлять на файлах тем концом с .txt
и нет .txt~
?
Мое решение состояло в том, чтобы выполниться del *.xyz~
до моего copy *.xyz
. Не блестящий, но это работает.
По-видимому, оболочка рассматривает и короткое и длинное название подстановочного расширения. Более длительное объяснение может быть найдено в ответе shf301. Это неудачно и вероятно остаток от Вас Дни Olde DOS, потому что это что cmd
попытка состоит в том, чтобы быть совместима с — вид — в конце концов.
Несколько опций здесь:
Использовать forfiles
, который имеет другое семантическое для подстановочного расширения:
forfiles /m *.txt /c "cmd /c copy @file foo"
Это доступно, по крайней мере, на Vista и позже.
Использовать for
и проверка расширение:
for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo
К сожалению, for
также возвраты любые файлы с .txt~
расширение, только используя подстановочное расширение. Вот почему мы должны проверить расширение во второй раз.
Использовать xcopy
. В то время как xcopy
имеет ту же семантику для подстановочного расширения как оболочка, которую можно дать ему файл с именами для игнорирования:
echo .txt~>tmpfile
xcopy *.txt foo /exclude:tmpfile
del tmpfile
Использовать robocopy
. В то время как robocopy
имеет ту же семантику для подстановочного расширения как оболочка, которую можно дать ему список файлов/подстановочных знаков для игнорирования:
robocopy . foo *.txt /XF *.txt~
Использовать for
, dir
и findstr
в соответствующей комбинации. Это по существу просто отфильтровывает все строки, которые имеют a ~
в конце и воздействует на остальных. if
вариант выше был более изящным, я думаю.
for /f "usebackq delims=" %i in (`dir /b *.txt ^| findstr /r "[^~]$"`) do @copy "%i" foo
Только для полноты: PowerShell:
Copy-Item *.txt foo
Я не уверен, как мешать dir/копии соответствовать только *.txt, но я могу объяснить, почему *.txt возвращает то, что он делает; это соответствует короткому имени файла, которое заканчивается .txt для всех файлов, сделайте dir/x *.txt для наблюдения этого. Эта проблема происходит для каждого набора расширений, которые запускаются с тех же первых трех символов (например, *.htm будет соответствовать htm, HTML, и даже htmlasdfasdf).
Также почти каждое Приложение Windows будет действовать этот путь, потому что API, который ОС обеспечивает для поиска файлов FindFirstFile, соответствует длинным именам файлов и коротким именам файлов. Заключить в кавычки:
Поиск включает длинные имена файлов и короткие имена файлов.
Необходимо будет сделать своего рода пользовательскую фильтрацию как предложенный ответ Johannes Rössel.
Так как Joey упомянул полноту, я отмечаю, как упомянуто здесь, что это варьируется согласно какой интерпретатор команд DIR
и COPY
команды каждый использует. DIR
команда в Принимает Управление и COPY
команда, для примеров, только соответствует длинным именам по умолчанию и так не показывайте это поведение. (Соответствие коротких, а также длинных имен может быть включено для совместимости с CMD DIR
и COPY
команды.)