Как я могу заставить команды «dir» и «copy» работать с «* .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~ ?

6 Solutions collect form web for “Как я могу заставить команды «dir» и «copy» работать с «* .xyz», но не «* .xyz ~»?”

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

Несколько вариантов:

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

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

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

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

     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 в соответствующей комбинации. Это по сути просто отфильтровывает все линии, которые имеют ~ в конце и работают на остальных. Я думаю, что вариант выше был более изящным.

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

     Copy-Item *.txt foo 

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

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

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

Вам нужно будет сделать какую-то специальную фильтрацию, как предложил Йоханнес Рёссел.

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

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

Существующие копии обложек ответов только что упали, но не перечислены.

Вы можете использовать бит архива для обеих целей. Хотя он предназначен для использования с XCOPY 1 , он также работает с DIR 2 .

шаги:

  1. Убедитесь, что бит архива установлен для всех файлов .txt :

     ATTRIB +A *.txt 
  2. Удалите бит архива из всех .txt~ файлов:

     ATTRIB +A *.txt~ 
  3. Перечислите все .txt файлы, у которых есть бит для архива:

     DIR /AA *.txt 

    Или скопировать их в somefolder либо somefolder :

     XCOPY /A *.txt somefolder/ 

1 XCOPY использует переключатель /A для исключения всех файлов, у которых нет установленного бита архива. Это можно использовать для исключения определенных файлов (например, временных файлов) из ежедневных резервных копий. С помощью переключателя /M он также удаляет бит архива из файлов, что удобно при копировании файлов на небольшие запоминающие устройства (например, дискеты). Кроме того, изменение файлов автоматически устанавливает бит архива, поэтому переключатель /M можно использовать для инкрементных резервных копий.

2 DIR /AA показывает только файлы, у которых установлен свой атрибут архива.

Вы можете попробовать: скопировать "* .txt"

  • Выбор прямоугольного текста в командной строке
  • Как найти и удалить несколько записей реестра Windows?
  • Воспроизвести звук (возможно, WAV?) Из командной строки Windows
  • Команда Windows для получения всей информации / свойств файла
  • Можно ли использовать команду «start» с пробелами в пути?
  • Почему «начать winword» работает, но просто «winword» не делает?
  • Более одного «Открыть xxxxx здесь как администратор»
  • Как подсчитать все вхождения определенной строки в файле с помощью командного файла?
  • Есть ли команда, которая позволяет мне установить предпочтительный IP-адрес для адаптера?
  • Перенаправление команд CMD (трубы) в ярлыке / ссылке на Windows 7?
  • Сохраните все имена профилей WLAN, хранящиеся на моей машине, в текстовый файл
  • Давайте будем гением компьютера.