Shell-скрипт: Имена файлов с одинаковыми буквами

Задача состоит в том, чтобы перечислить все имена файлов из каталога, которые содержат одинаковые буквы, разница только в порядке букв, таких как asd.txt и dsa.txt.

В powershell есть рабочий код:

 for i in `ls -v $dir`; 
do
 temp=$(grep -o . <<<"$i"|sort|tr -d "\n")
 temper=$i
 for j in `ls -v $dir`; 
 do
    temp2=$(grep -o . <<<"$j"|sort|tr -d "\n")  
    if [ "$temp" = "$temp2" ] && [ "$temper" != "$j" ];
    then
        echo $temper
        echo $j
    fi
 done;
done;

Это почти рабочий код, проблема в том, что список правильных файлов 2 раза, есть идеи, как это исправить?


person user3063349    schedule 12.12.2013    source источник


Ответы (1)


бить

Это сломается для файлов с пробелами в имени:

getchars () { echo "$1" | sed 's/./&\n/g' | sort | tr -d '\n'; }
declare -A files
for file in *; do files["$(getchars $file)"]+="$file "; done

Тестирование в директории с файлами asdf.txt, fdsa.txt, foo, foobar, tadxfst.

for key in "${!files[@]}"; do printf "%s\t%s\n" "$key" "${files[$key]}"; done
foo foo 
.adfsttx    asdf.txt fdsa.txt tadxfst. 
abfoor  foobar 

В зависимости от того, что вы делаете с группами, я бы использовал что-то вроде perl:

perl -e '
    opendir $dir, ".";
    while (readdir $dir) {
        next if /^\.\.?$/;
        push @{$files{join "", sort split //}}, $_;
    } 
    # now do something with the files
    use Data::Dumper;
    print Dumper \%files
'
$VAR1 = {
          '.adfsttx' => [
                          'asdf.txt',
                          'fdsa.txt',
                          'tadxfst.'
                        ],
          'foo' => [
                     'foo'
                   ],
          'abfoor' => [
                        'foobar'
                      ]
        };
person glenn jackman    schedule 12.12.2013