28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
1

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

12.02.2013, 12:22. Показов 5709. Ответов 13
Метки нет (Все метки)

Здрасти. Задача: проверить наличие в текущем каталоге файлов одинакового размера. Если такие файлы есть – вывести их имена.
PowerShell
1
get-childitem | where-object {$_.attributes -ne 'directory'} | foreach-object {$getobject=$_; foreach-object {if ($_.length - eq $getobject.length) {if ($getobject.name -ne $_.name) {echo $getobject.name, $_.name}}}}
Сначала выбираю только файлы, потом первый запоминаю, сравниваю с остальными, если размер одинаковый и имена не совпадают, должен выводить оба имени. А на деле сравнивает каждый файл только сам с собой.
Что я не понимаю?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2013, 12:22
Ответы с готовыми решениями:

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

Вывести количество файлов с указанными именами, которые имеются в текущем каталоге
Даны имена четырех файлов. Вывести количество файлов с указанными именами, которые имеются в...

Вывести количество файлов с указанными именами, которые имеются в текущем каталоге
Задание на бинарные файлы : Даны имена четырех файлов. Вывести количество файлов с указанными...

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

13
88 / 88 / 37
Регистрация: 28.11.2012
Сообщений: 309
12.02.2013, 12:39 2
PowerShell
1
2
3
4
5
6
7
8
9
get-childitem |?{!$_.PSIsContainer} |%{
    $getobject=$_; 
    ls|?{!$_.PSIsContainer}|%{
        if ($_.length -eq $getobject.length) {
            if ($getobject.name -ne $_.name) 
            {echo $getobject.name}
        }#if ($_.length -eq $getobject.length)
    }#ls|?{!$_.PSIsContainer}
}#get-childitem |?{!$_.PSIsContainer}
у меня вроде работает
1
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
12.02.2013, 17:26  [ТС] 3
Спасибо за вариант, только у меня не работает, выводит >> и всё... Как освобожусь попробую придумать что-нибудь.
0
88 / 88 / 37
Регистрация: 28.11.2012
Сообщений: 309
13.02.2013, 08:09 4
если скопировать Ваш код как есть то posh ругается на пробел между - eq в куске
PowerShell
$_.length - eq $getobject.length
.
но и его если убрать ничего не выводит. а вот если заменить
PowerShell
foreach-object {if ($_.length -eq $getobject.length)
на
PowerShell
ls|foreach-object {if ($_.length -eq $getobject.length)
то файлы находятся правда выводятся дважды и если в выводе убрать $_.name, то все вроде работает как надо
0
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
13.02.2013, 08:32  [ТС] 5
Это мб из-за разных версий? У меня 2.0 на ХР..
0
88 / 88 / 37
Регистрация: 28.11.2012
Сообщений: 309
13.02.2013, 09:43 6
тоже так же XP SP3 PoSH 2.0
1
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
16.02.2013, 10:14 7
PowerShell
1
2
3
4
5
6
7
8
9
10
$dir = "d:\"
get-childitem $dir | where-object {$_.attributes -ne 'directory'} | 
foreach-object {
$getobject=$_;
get-childitem $dir | 
foreach-object {
if ($_.length -eq $getobject.length) {
if ($getobject.name -ne $_.name) 
{echo $getobject.name, $_.name
}}}} |sort -Property length, name |foreach-object { $i++; if ($i % 2 ) {$_}}
0
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
16.02.2013, 14:09  [ТС] 8
Спасибо. Т.е. надо во втором цикле ещё раз перебрать элементы... ...зря я понадеялся, что он сам переберёт. Так всё работает, только выводит перед ответом ещё кучу имён, включая папки и имена некоторых файлов. И ещё при выводе одинаковых выводит имена дважды: когда проверяет на совпадение file1 и file2 - они одинаковые, потом проверяет file2 и file1 - они снова одинаковые, опять их выводит. Щас подумаю, выдалась минутка.

Добавлено через 1 час 4 минуты
..добавил проверку
PowerShell
1
2
3
4
5
6
7
8
9
10
$dir = "d:\"
get-childitem $dir | where-object {$_.attributes -ne 'directory'} | 
foreach-object {
$getobject=$_;
get-childitem $dir | 
foreach-object { if ($_.attributes -ne 'directory') {
if ($_.length -eq $getobject.length) {
if ($getobject.name -ne $_.name) 
{echo $getobject.name, $_.name
}}}}} |sort -Property length, name |foreach-object { $i++; if ($i % 2 ) {$_}}
..теперь выводит >>, как и в первом примере:

Цитата Сообщение от borne Посмотреть сообщение
PowerShell
1
2
3
4
5
6
7
8
9
get-childitem |?{!$_.PSIsContainer} |%{
$getobject=$_; 
ls|?{!$_.PSIsContainer}|%{
if ($_.length -eq $getobject.length) {
if ($getobject.name -ne $_.name) 
{echo $getobject.name}
}#if ($_.length -eq $getobject.length)
}#ls|?{!$_.PSIsContainer}
}#get-childitem |?{!$_.PSIsContainer}
...что этот символ (>>) вообще означает? ...и заодно, что делает цикл
Цитата Сообщение от Cat2 Посмотреть сообщение
PowerShell
1
foreach-object { $i++; if ($i % 2 ) {$_}
...в сети инфы 0.
0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
17.02.2013, 10:38 9
Вообще-то правильным будет такой вариант
PowerShell
1
2
3
4
5
6
7
8
$dir = "d:\"
get-childitem $dir | where-object {$_.attributes -ne 'directory'} | 
foreach-object {
$getobject=$_;
get-childitem $dir | 
foreach-object {
if ($_.length -eq $getobject.length -and $getobject.name -ne $_.name) 
{$getobject.name}}} |sort  | get-unique
0
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
17.02.2013, 11:53  [ТС] 10
Так вот как and использовать, забавно... Попробую в понедельник, а так на первый взгляд, выводит только одно имя, а второй раз уже имя второго файла и выглядит логично. Спасибо. А второй раз в get-childitem можно переменную не использовать, я думаю...
1
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
17.02.2013, 12:11 11
Цитата Сообщение от Кровавая Рука Посмотреть сообщение
А второй раз в get-childitem можно переменную не использовать, я думаю...
Можно и в первом не использовать. Но тогда надо сделать так
PowerShell
1
2
3
4
5
6
7
8
9
cd  "d:\"
 
get-childitem  | where-object {$_.attributes -ne 'directory'} | 
foreach-object {
$getobject=$_;
get-childitem  | 
foreach-object {
if ($_.length -eq $getobject.length -and $getobject.name -ne $_.name) 
{$getobject.name}}} |sort  | get-unique
1
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
20.02.2013, 19:33  [ТС] 12
..хотя объективная логика подсказывает, что работать должно. Ну некуда проще уже.. В суровой реальности не находит ни одного файла.
0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
21.02.2013, 07:17 13
может Вам стоит добавить в get-childitem ключ -force?
1
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
24.02.2013, 15:49  [ТС] 14
Цитата Сообщение от Cat2 Посмотреть сообщение
может Вам стоит добавить в get-childitem ключ -force?
нет, не стоит) ...это, видимо неполадки с моим компом... переделал и всё работает. Последний вариант правильный. Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2013, 15:49
Помогаю со студенческими работами здесь

Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
Здравствуйте.. Выдали данное задание на С++ под linux Разработать программу, которая выводит на...

Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
Здравствуйте.. Выдали данное задание на С++ под linux Разработать программу, которая выводит на...

Проверить существование в текущем каталоге файлов, перечисленных в командной строке.
Народ, помогите пожалуйста! Надо написать скрипт по заданию: Проверить существование в текущем...

Вывести все файлы с расширением pas в текущем каталоге
Написать программу, которая осуществляет вывод всех файлов с расширением pas в текущем каталоге.


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru