2017-02-21 21 views
0

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

Моя точка эта команда CMD

forfiles /s /m *.* /d -90 /c "cmd /c echo @file is at least 90 days old." 

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

Будет ли эта работа поддерживать структуру папок?

forfiles /s /m *.* /d -90 /c "move @file c:\temp" 

У кого-нибудь есть какие-либо советы или предвидеть какие-либо проблемы при попытке сделать это таким образом?

Robocopy не является вариантом.

+0

Поиск переполнения стека [\ [batch-file \] или \ [cmd \] перемещение файлов старше] (http://stackoverflow.com/search?q=%5Bbatch-file%5D+or+%5Bcmd % 5D + move + files + старше +) возвращает 75 ударов. Поэтому в первый раз это не было задано. Я предлагаю вам прочитать найденные вопросы и ответы. Основная проблема при использовании интерпретатора команд Windows - это не встроенная поддержка вычислений разницы во времени. Лучше использовать PowerShell. Основной файл командного файла/cmd для всех вопросов «старше»: [Пакетный файл для удаления файлов старше N дней] (http://stackoverflow.com/questions/51054/). – Mofi

ответ

1

forfiles выполняет командную строку после опции /C с текущим итерированным каталогом в качестве рабочего каталога. Это также относится к опции /S.

Ссылка @file возвращает чистое (цитируемое) имя файла; ссылка @relpath возвращает путь относительно данного корня (позади опции /P, которая по умолчанию соответствует текущему каталогу).

Таким образом, вы можете попробовать что-то вроде этого (обратите внимание, что префикс cmd /C требуется для cmd -Internal команд, как move, echo или if, верхний корпус ECHO просто отображает move командную строку, которая будет выполняться без):

forfiles /S /D -90 /C "cmd /C if @isdir==FALSE ECHO move @relpath 0x22C:\temp\0x22" 

Это переведет все файлы в каталог C:\temp, потеряв исходную иерархию каталогов. (Обратите внимание, что if @isdir==FALSE запрос предотвращает подкаталоги из обработки.)

Поэтому нам нужно создать каталоги назначения самостоятельно, например:

forfiles /S /D -90 /C "cmd /C if @isdir==FALSE (for %F in (@relpath) do @(2> nul mkdir 0x22C:\temp\%~F\..0x22 & ECHO move @relpath 0x22C:\temp\%~F0x22))" 

Что здесь происходит:

  • в целом, 0x22 - это котировочный знак ";
  • if @isdir==FALSE обеспечивает обработку только файлов;
  • цикл for просто удаляет окружающие кавычки по пути, полученному @relpath при доступе к %~F; обеспечить удвоение знаков % на случай, если вы используете код в пакетном файле!
  • mkdir создает родительский каталог текущего итерационного элемента; 2> nul скрывает сообщение об ошибке в случае, если каталог уже существует;
  • move предшествует ECHO для целей тестирования; удалите его, чтобы на самом деле переместить файлы;

Если вы хотите, чтобы перезаписать файлы в месте назначения, просто добавьте опцию /Y в move.


Следующая командная строка может также работать на пути образца, но он будет не в состоянии точно в случае, если путь назначения содержит Пробелы или других ядовитых символов, потому что цитата не надлежащим образом:

forfiles /S /C "cmd /C if @isdir==FALSE (2> nul mkdir C:\temp\@relpath\.. & ECHO move @relpath C:\temp\@relpath)" 
+0

Красивый ответ, Что касается этой команды (извинения, я не знаю, как ее форматировать, как вы делали выше) файлы/S/D -90/C "cmd/C, если @ isdir == FALSE (для % F in (@relpath) do @ (2> nul mkdir 0x22C: \ temp \% ~ F \ .. 0x22 & ECHO move @relpath 0x22C: \ temp \% ~ F0x22)) " Будет ли это работать, если есть поддиректории суб-директив с файлами в них? В моем случае это возможно, я мог бы перемещать папку верхнего уровня на основе собственной даты создания, было бы проще? – Krom

+0

Да; существует переключатель '/ S', который сообщает' forfiles' перечислять также подкаталоги; даже если сами подкаталоги могут не соответствовать фильтрам ('/ D','/M'), любые содержащиеся подпункты все еще возвращаются, если они совпадают. Обратите внимание, что 'forfiles/D' не заботятся о датах создания, он касается только последних дат изменения файлов и каталогов ... – aschipfl

+0

Googling around Я не вижу переключателя, который работает с датой создания файлов/папок вообще для это вопрос. Я считаю, что эта команда удалит папку старше 90, но опять же, потому что/D она основана на измененной дате. forfiles/p "c:/temp"/s/m *. */C "cmd/c Del @path"/d -90 Проблема в том, что кто-то может изменить файл через 89 дней, и тогда скрипт будет перемещать все, кроме этого файла, вероятно, создавая большой беспорядок. Возможно, это не лучший способ попытаться сделать это, так как переход от верхнего уровня, созданного в каталог, был бы лучшим способом, и я не уверен, что смогу. – Krom

 Смежные вопросы

  • Нет связанных вопросов^_^