Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
yagami2
17 / 16 / 3
Регистрация: 15.01.2015
Сообщений: 186
#1

В каждом подкаталоге найти файл, созданный последним

18.02.2016, 10:55. Просмотров 1764. Ответов 6
Метки нет (Все метки)

Приветствую. В powershell нубас. Так, что пока туплю на ровном месте...
Есть каталог в нем много подкаталогов. В каждом из подкаталогов лежат файлы (файлы создаются с разной частотой). Задача в том чтоб найти самый последний который был создан в каждом из подкаталогов.
Пробовал так...
PowerShell
1
2
3
4
foreach ($f in "D:\test\*")
{
Get-ChildItem $f -Recurse | sort lstwritetime |  select-object -last 1
}
Сама по себе команда
PowerShell
1
Get-ChildItem $f -Recurse | sort lstwritetime |  select-object -last 1
работает, но она находит самый последний файл из всех подкаталогов сразу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2016, 10:55
Ответы с готовыми решениями:

Команда должна создать в каждом подкаталоге файл со списком файлов
Добрый день. Нужна помощь в составлении shell команды. Задача такова: в...

Подсчет количества файлов в каждом подкаталоге
Доброго времени суток! Подскажите пожалуйста, как написать скрипт который бы...

Написать командный файл, который создает текстовый файл в указанном подкаталоге корневого диска...
Помогите сделать(((не могу(((сколько бы не пробовала.Написать командный файл,...

Взять готовый файл с набором чисел, в нем найти максимальное значение и записать во второй созданный файл
Работа с файлами: Необходимо взять готовый файл с набором чисел, в нем найти...

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

6
KDE777
717 / 532 / 229
Регистрация: 22.01.2016
Сообщений: 1,491
18.02.2016, 11:12 #2
yagami2,

PowerShell
1
ls C:\Temp -R|? PSIsContainer|%{ls $_.FullName -File|sort LastWriteTime|select -L 1}
Или без сокращений

PowerShell
1
2
3
4
Foreach ($folder in Get-ChildItem -Path C:\Temp -Recurse | Where-Object{$_.PSIsContainer})
{
    Get-ChildItem -Path $folder.FullName -File | Sort-Object LastWriteTime | Select-Object -Last 1
}
1
greg zakharov
Покинул форум
1947 / 823 / 236
Регистрация: 07.05.2015
Сообщений: 1,645
18.02.2016, 13:49 #3
yagami2, для начала определитесь что все же требуется, ибо
Цитата Сообщение от yagami2
Задача в том чтоб найти самый последний который был создан в каждом из подкаталогов.
согласно логике означает искать файлы по дате создания (CreatedTime), а не их последней модификации (LastWriteTime). Иными словами:
PowerShell
1
ls D:\test -r|?{$_.PSIsContainer}|%{ls $_.FullName|?{!$_.PSIsContainer}|sort CreatedTime|select FullName -l 1}
1
KDE777
717 / 532 / 229
Регистрация: 22.01.2016
Сообщений: 1,491
18.02.2016, 15:21 #4
Цитата Сообщение от greg zakharov Посмотреть сообщение
согласно логике означает искать файлы по дате создания
Согласен. Я это видел + видел, что далее автор пытается искать некое "lstwritetime". Поэтому уточнять не стал, а привёл пример с LastWriteTime, т.к. заменить его (если надо) на CreationTime или LastAccessTime труда не составит...

Тут есть ещё два уточнения, мой и ваш пример пропустит файлы в корневой папке (если они там есть). А так же не учитывается, что может быть несколько файлов с одинаковой датой создания - не оговорено что выводить в этом случае.

PowerShell
1
2
3
4
5
6
7
8
9
10
$path = 'C:\Temp'
 
$date = (ls $path -File | Sort CreationTime | select CreationTime -Last 1).CreationTime
ls $path -File | ? CreationTime -eq $date | select FullName,CreationTime
 
Foreach ($folder in ls $path -Recurse | ? PSIsContainer)
{
    $date = (ls $folder.FullName -File | Sort CreationTime | Select CreationTime -Last 1).CreationTime
    ls $folder.FullName -File | ? CreationTime -eq $date | Select FullName,CreationTime
}
1
greg zakharov
Покинул форум
1947 / 823 / 236
Регистрация: 07.05.2015
Сообщений: 1,645
18.02.2016, 19:07 #5
Цитата Сообщение от KDE777
...пропустит файлы в корневой папке...
Все верно, ведь далее по конвейеру будут обрабатываться только папки.
Цитата Сообщение от KDE777
...может быть несколько файлов с одинаковой датой создания...
Более того, время также может быть равным. Ну, а если все же только один файл:
PowerShell
1
2
3
$l = {param([String]$dir) ls $_|?{!$_.PSIsContainer}|sort CreationTime|select FullName -l 1 -exp FullName}
&$l ($$ = 'D:\test')
[IO.Directory]::GetDirectories($$, '*', [IO.SearchOption]::AllDirectories) | % {&$l $_}
1
KDE777
717 / 532 / 229
Регистрация: 22.01.2016
Сообщений: 1,491
18.02.2016, 19:52 #6
Цитата Сообщение от greg zakharov Посмотреть сообщение
Более того, время также может быть равным
Видимо я некорректно выразился - под датой создания, в этом случае я имел ввиду полное совпадение CreationTime, что видно в скрипте, которым я это проиллюстрировал.

Цитата Сообщение от greg zakharov Посмотреть сообщение
Ну, а если все же только один файл:

Не по теме:

Ваш пример хорош, но человеку, который написал "В powershell нубас" я бы его точно бы не предлагала, как решение его задачи :)



+ ваш пример, если текущая папка не D:\Test, выдаст файл не из корневой папки - &$l ($$ = 'D:\test') - а из текущей...

Добавлено через 3 минуты
PowerShell
1
2
3
4
$l = {param([String]$dir) ls $_|?{!$_.PSIsContainer}|sort CreationTime|select FullName -l 1 -exp FullName}
&$l ($$ = 'c:\temp')
[IO.Directory]::GetDirectories($$, '*', [IO.SearchOption]::AllDirectories) | % {&$l $_}
$pwd
Кликните здесь для просмотра всего текста

C:\Intel\Logs\IntelChipset.log
C:\temp\D-Link\Manual.pdf
C:\temp\_Test\test.xml

Path
----
C:\Intel\Logs
1
yagami2
17 / 16 / 3
Регистрация: 15.01.2015
Сообщений: 186
11.03.2016, 09:35  [ТС] #7
Извиняюсь за долгое молчание....
Первый способ подошел на все 100 (т.к. в корневой папке фалов нет. и равным время быть не может). Что касается "CreatedTime" в моей задаче в общем-то не важно, но вы правы так будет более кошерно.
Большое спасибо за помощь.
0
11.03.2016, 09:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2016, 09:35

Найти среднее арифметическое всех чисел, входящих в созданный файл
Создать файл из 50 целых чисел, используя генератор случайных чисел. Вывести...

Разработать пакетный файл для проверки наличия файлов документов (*.doc, *.txt) в данном подкаталоге
Нужно Разработать пакетный файл для проверки наличия файлов документов (*.doc,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru