Как я могу получить “dir” и “скопировать” команды для работы на “*.xyz”, но не “*.xyz ~”?

Когда я использую 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~?

4
задан 15.07.2015, 12:40

5 ответов

Мое решение состояло в том, чтобы выполниться del *.xyz~ до моего copy *.xyz. Не блестящий, но это работает.

1
ответ дан 07.12.2019, 20:11
  • 1
    +1. D'oh! Выполнение вещей в козырях правильного порядка, зная всех спокойных других команд предложено. – beggs 01.11.2009, 17:50
  • 2
    Ну, первоначально я не предполагаю, что люди были бы готовы выбросить файлы :-) – Joey 01.11.2009, 23:54

По-видимому, оболочка рассматривает и короткое и длинное название подстановочного расширения. Более длительное объяснение может быть найдено в ответе shf301. Это неудачно и вероятно остаток от Вас Дни Olde DOS, потому что это что cmd попытка состоит в том, чтобы быть совместима с — вид — в конце концов.

Несколько опций здесь:

  1. Использовать forfiles, который имеет другое семантическое для подстановочного расширения:

    forfiles /m *.txt /c "cmd /c copy @file foo"
    

    Это доступно, по крайней мере, на Vista и позже.

  2. Использовать for и проверка расширение:

    for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo
    

    К сожалению, for также возвраты любые файлы с .txt~ расширение, только используя подстановочное расширение. Вот почему мы должны проверить расширение во второй раз.

  3. Использовать xcopy. В то время как xcopy имеет ту же семантику для подстановочного расширения как оболочка, которую можно дать ему файл с именами для игнорирования:

    echo .txt~>tmpfile
    xcopy *.txt foo /exclude:tmpfile
    del tmpfile
    
  4. Использовать robocopy. В то время как robocopy имеет ту же семантику для подстановочного расширения как оболочка, которую можно дать ему список файлов/подстановочных знаков для игнорирования:

    robocopy . foo *.txt /XF *.txt~
    
  5. Использовать for, dir и findstr в соответствующей комбинации. Это по существу просто отфильтровывает все строки, которые имеют a ~ в конце и воздействует на остальных. if вариант выше был более изящным, я думаю.

    for /f "usebackq delims=" %i in (`dir /b *.txt ^| findstr /r "[^~]$"`) do @copy "%i" foo
    
  6. Только для полноты: PowerShell:

    Copy-Item *.txt foo
    
5
ответ дан 07.12.2019, 20:11

Я не уверен, как мешать dir/копии соответствовать только *.txt, но я могу объяснить, почему *.txt возвращает то, что он делает; это соответствует короткому имени файла, которое заканчивается .txt для всех файлов, сделайте dir/x *.txt для наблюдения этого. Эта проблема происходит для каждого набора расширений, которые запускаются с тех же первых трех символов (например, *.htm будет соответствовать htm, HTML, и даже htmlasdfasdf).

Также почти каждое Приложение Windows будет действовать этот путь, потому что API, который ОС обеспечивает для поиска файлов FindFirstFile, соответствует длинным именам файлов и коротким именам файлов. Заключить в кавычки:

Поиск включает длинные имена файлов и короткие имена файлов.

Необходимо будет сделать своего рода пользовательскую фильтрацию как предложенный ответ Johannes Rössel.

1
ответ дан 07.12.2019, 20:11

Вы могли попробовать: копия "*.txt"

-1
ответ дан 07.12.2019, 20:11
  • 1
    Это - точно то же как без кавычек. Таким образом, что это должно выполнить? – Joey 01.11.2009, 02:56
  • 2
    Кажется, что это было бы disinclude суффикс '~'. Следовательно меня использующий фразу "мог попробовать". – eqzx 02.11.2009, 06:39

Так как Joey упомянул полноту, я отмечаю, как упомянуто здесь, что это варьируется согласно какой интерпретатор команд DIR и COPY команды каждый использует. DIR команда в Принимает Управление и COPY команда, для примеров, только соответствует длинным именам по умолчанию и так не показывайте это поведение. (Соответствие коротких, а также длинных имен может быть включено для совместимости с CMD DIR и COPY команды.)

0
ответ дан 07.12.2019, 20:11

Теги

Похожие вопросы