5

Мне нужно скопировать все текстовые файлы в одну папку, имена которых состоят из пяти символов. Я знаю, что эта команда для листинга:

$ dir folder /B | findstr /R "^.....\.txt"

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

5 ответов5

5

Я спрашивал (не только для себя): "Разве это не работает просто ..."?

copy  C:\ORIG_DIR\?????.txt C:\Dest_Dir

Благодаря G-Man проверено, что в PowerShell это работает, в то время как в cmd.exe вышеупомянутая команда будет копировать каждое совпадение до пяти символов и со всеми расширениями, которые начинаются с .txt .

Вопросительный знак (?)

Используйте знак вопроса в качестве замены одного символа в имени. Например, если вы наберете gloss?.Doc, вы найдете файл Glossy.doc или Gloss1.doc, но не Glossary.doc.

Ссылка:

1

Вот еще один пакетный подход:

@echo off
setlocal enabledelayedexpansion
for %%f in (*.txt) do (
      set foo=%%f
      set foo=!foo:~5,5!
      if !foo!==.txt (
            (This filename (%%f) matches the pattern ?????.txt; do what you want with it.)
      )
)

!foo:~5,5! это экземпляр !variable:~offset:length! механизм подстроки; он извлекает подстроку имени файла, начиная с 6-го символа (смещение 5) и длиной 5 (достаточно, чтобы захватить .txt плюс еще один символ, если есть больше).  Таким образом, переменная foo имеет значение .txt если 6-й, 7-й, 8-й и 9-й символы имени файла . , t , x и t , и нет 10-го символа.

1

Для тестирования с echo в однострочнике (он должен работать с подпапкой, если вы добавляете /s в команду dir )

for /f "delims=" %a in ('dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"') do @echo %~fa

однострочное копирование

for /f "delims=" %a in (
'dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"'
) do @copy  "%~fa" "destination-dir"

Пакетный файл

for /f "delims=" %%a in (
  'dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"'
) do (
  copy  "%%~fa" "destination-dir"
)

Редактировать:

/a-d файлы сканирования объявлений
/ad папки сканирования объявлений
Без /a[d|-d] он будет сканировать как видеть dir /? для дальнейшего чтения

Если я добавил "?????.txt" в команду « dir », это уменьшит область сканирования и тем самым сократит время сканирования. Вы всегда можете расширить область сканирования в команде « dir », но наиболее важным является шаблон в команде « findstr »

Я изменил "^.....\.txt" к "\\.....\.txt$" для возможности сканирования имени папки.

.   Wildcard: any character
ˆ   Line position: beginning of line
$    Line position: end of line
\.  Escape: literal use of metacharacter .

Смотрите findstr /? для дальнейшего чтения

Почему это не работает в некоторых случаях? Поскольку не существует универсального решения, вы должны адаптировать команду в вашем случае. Если вы используете /b без /s, команда dir выдаст вывод без косой черты \ поэтому шаблон findstr с \\ потерпит неудачу.

Это не удастся: dir /b "*.txt"|findstr /R "\\........$"
Когда это будет успешно: dir /b "*.txt"|findstr /R "^........$"

Как и в случае с командой dir которая выдает результат, когда слово шаблона поиска находится в конце строки, разделенной конечной косой чертой, также произойдет сбой.

Как это будет терпеть неудачу: dir /b /s "*.txt"|findstr /R "^........$"
но это увенчается успехом: dir /b /s "*.txt"|findstr /R "\\........$"

1

Это возможно в пакетном режиме, но легко в PowerShell.

ls | foreach { if (($_.BaseName.Length -eq 5) -and ($_.Extension -eq ".txt")) 
    { $_.CopyTo("\Name\Of\Target\Folder\" + $_.Name) }

Вы также можете сделать это, проверив имена файлов по регулярному выражению, но этот метод работает нормально.

1

В пакетном режиме вы можете сделать что-то вроде этого:

@Echo OFF

Set "targetDir=C:\Dir"

For %%# In ("*.txt") DO (

    (Echo "%%~nx#" | findstr /R "^......\.")1>Nul 2>&1 && (

        Echo Copying "%%~nx#" ...
        (Copy /Y "%%~f#" "%targetDir%\%%~nx#")1>NUL

    )
)

Pause&Exit /B 0

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