Сценарий оболочки: удаление файлов, если папка с таким именем не существует

0

У меня есть набор папок и набор *.DAT файлы.
Я хочу удалить *.DAT файл, если нет папки с тем же именем (без .DAT ) существует.
Мне понадобилось некоторое время, чтобы прийти к этому решению:

find . -type d > dirs.txt
for F in `find *.DAT`
do
  F=$(sed 's|\.DAT||g' <<< $F)
  if grep "$F" dirs.txt; then
    echo "$F found"
  else
    rm $F.DAT
  fi
done

Но я чувствую, что должно быть гораздо более простое решение (элегантный однострочный без создания файла? ...?). Я прав?

mic
источник
Папки обычно находятся рядом с файлом .DAT, или они разбросаны?
grawity
@grawity: папки и файлы .DAT находятся в одной папке.
mic

Ответы:

2

Вам не нужно использовать sed удалить .DAT если вы используете bash: расширение встроенного параметра ${F%.DAT} достигает того же самого без использования подоболочки и внешней программы.

Если каталоги были в произвольных местах относительно .DAT файлы, то файл списка каталогов является наиболее эффективным способом ее решения, но, учитывая, что оба находятся в одном месте, гораздо более простой ответ:

find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done

Обратите внимание, что это будет обрабатывать имена файлов со встроенными пробелами, чего нет в вашем решении.

Для других оболочек можно использовать аналогичную технику, но я не могу говорить за них.

AFH
источник