Удалите определенный файл из каталога, если он единственный

У меня много каталогов и подкаталогов. Я хочу рекурсивно удалить один конкретный файл из каталога, если он единственный. Также предположите, что в этом каталоге нет подкаталогов. Итак, чтобы подвести итог, предполагается следующее:

  • Имя файла README.TXT (без учета регистра)
  • В каталоге, где находится этот файл, нет других файлов или каталогов

Состав:

mkdir usecase cd usecase mkdir destroy_this touch destroy_this/readme.txt mkdir do_not_destroy_this touch do_not_destroy_this/readme.txt touch do_not_destroy_this/something-else.txt mkdir do_nothing cd do_nothing mkdir rm_this touch rm_this/README.TXT cd .. mkdir do_nothing_here cd do_nothing_here mkdir has_sub_dir touch README.TXT cd .. 

Выполнение приведенного выше результата приведет к этой древовидной структуре:

 $ tree . . `-- usecase |-- destroy_this | `-- readme.txt |-- do_not_destroy_this | |-- readme.txt | `-- something-else.txt |-- do_nothing | `-- rm_this | `-- README.TXT `-- do_nothing_here |-- has_sub_dir `-- README.TXT 

Это то, что у меня есть до сих пор:

 find . -type f -iname "readme.txt" -exec sh -c 'ls $(dirname "{}") | wc -l' \; 

Идея состоит в том, что я подсчитываю количество файлов и каталогов, и если это один, то удалите файл.

2 Solutions collect form web for “Удалите определенный файл из каталога, если он единственный”

У вас есть хорошая база для начала. Если вы изменили содержимое своего -exec вы могли бы ввести конструкцию if/then которая позволила бы вам воздействовать на состояние подсчета 1 или нет.

 $ find . -type f -iname "readme.txt" -exec \ sh -c 'if [ "$(ls $(dirname "{}") | wc -l)" -eq "1" ]; \ then echo "yes"; \ else echo "no"; \ fi' \; no yes yes no 

С этим мы могли бы расширить команду echo "yes" чтобы выполнить фактическое удаление файла. Что-то вроде rm "{}" должно делать трюк.

пример

 $ find . -type f -iname "readme.txt" -exec \ sh -c 'if [ "$(ls $(dirname "{}") | wc -l)" -eq "1" ]; \ then echo "removing {}.."; rm "{}"; \ else echo "no"; \ fi' \; no removing ./usecase/destroy_this/readme.txt.. removing ./usecase/do_nothing/rm_this/README.TXT.. no 

Выполнение вышеуказанного 2-го раза подтверждает, что файлов больше нет:

 $ find . -type f -iname "readme.txt" -exec \ sh -c 'if [ "$(ls $(dirname "{}") | wc -l)" -eq "1" ]; \ then echo "removing {}.."; rm "{}"; \ else echo "no"; \ fi' \; no no 
 find . -type f -iname "readme.txt" -exec sh -c ' for f do ls -1qap ${f%/*} | grep -v "\(readme.txt\$\|/\$\|.\{1,2\}\$\)" && echo rm "$f" ; done' \{\} + 
  • Shell: выбор доступной программы
  • Длина строки со сценарием оболочки
  • Сценарий Bash для обработки файла данных эксперимента
  • где я должен изменить данный сценарий оболочки?
  • XOR переменной оболочки и двоичный файл
  • Как проверить ввод соответствует определенному формату
  • Удалить строки из файла
  • для чего используется $ # в скрипте?
  • Как создать каталог, объединив два имени?
  • Что делает команда unix 'pick'?
  • Проверка файлов в другой папке с использованием цикла
  • Interesting Posts

    выполнить скрипт на клавише быстрого доступа на всех уровнях выполнения

    Как использовать одинарные кавычки внутри ssh и sqlplus

    Сообщение emacsclient отказано

    Предпосылки создания модуля ядра Linux

    Найти каталоги и файлы с разрешениями, отличными от 775/664

    Терминал, который установлен на закрытие .. принимает disaned gui_app с собой

    Как передать список команд, отображаемых по «tab complete»?

    Каковы каталоги generic-pae в / lib / modules?

    systemd: запуск сценария при завершении работы после того, как файловые системы установлены только для чтения

    Команда для поиска открытых портов

    Clamav configure: ошибка: в вашей установке OpenSSL отсутствует функция X509_VERIFY_PARAM

    Есть ли способ печати в заданное место для печати в файл?

    Серый фон в удаленном рабочем столе vncviewer

    AWK для сглаживания данных

    Запись содержимого из файла в другой файл с установленными временными интервалами с использованием разделителей

    Linux и Unix - лучшая ОС в мире.