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

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

У меня есть набор папок и набор *.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

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

решение1

Вам не нужно использовать , 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

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

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

Связанный контент