Использование языка bash со следующей архитектурой

 - directory1
        - entries
 - directory2
        - entries

Я хочу удалить дубликаты записей и просто сохранить одну из них. Я использую следующий скрипт:

for dir in *
do 
    [ -d "$dir" ] && for file in "$dir"/*
    do 
        filename=$(basename "$file")
        find . -name "$filename" -not -path "*$dir*" -exec rm "{}" \;
    done
done

Проблема, с которой я столкнулся, заключается в том, что когда каталог очищается, filename="*" . Поэтому find вернет все записи и удалит все.

Я не могу использовать какие-либо инструменты, так как машина, которую я использую, не может получить доступ к Интернету.

2 ответа2

1

Добавление следующего теста сделало свое дело:

for dir in *
do 
    [ -d "$dir" ] && [ "$(ls -A $dir)" ] && for file in "$dir"/*
    do 
        filename=$(basename "$file")
        find . -name "$filename" -not -path "*$dir*" -exec rm "{}" \;
    done
done
0

С твоим решением я не понимаю, как ты его сохранишь. Если файл 'f' находится в каталогах 'A' и 'B':

  • когда ваш внешний цикл for находится на 'A', поиск будет печатать B/f.
  • ------------------------------- 'B', --------------- ---- А / ф.

Однако вы ничего не делаете, вы просто печатаете.

Я предлагаю это, не вкладывая находку в для в в для:

there_can_be_only_one.sh:

#!/bin/sh
tmp=$(mktemp -d)
dir=$1

for d in "$dir"/*; do
  if [ -d "$d" ]; then
    for f in "$d"/*; do
      bf=$(basename "$f")
      if [ -a "${tmp}/$bf" ]; then
        rm "$f"
      else
        touch "${tmp}/$bf"
      fi
    done
  fi
done

rm -rf "$tmp"

По сути, создается (n пустой) новый временный каталог, $ tmp. Затем, для каждого файла $ f, если $ tmp содержит файл с тем же именем файла, то удалите этот файл $ f, иначе создайте файл с таким именем в $ tmp.

yarl@badaboum:~/work$ ls
foo  there_can_be_only_one.sh
yarl@badaboum:~/work$ ls -R foo/
foo/:
dir0  dir1  dir2

foo/dir0:
de  hello  mammouth

foo/dir1:
arg  de  heart  hello

foo/dir2:
arg  blarg  de

yarl@badaboum:~/work$ ./there_can_be_only_one.sh foo/
yarl@badaboum:~/work$ ls -R foo/
foo/:
dir0  dir1  dir2

foo/dir0:
de  hello  mammouth

foo/dir1:
arg  heart

foo/dir2:
blarg

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