Intereting Posts
Как заставить openssl шифровать пароли, такие как php через командную строку Ошибка «Только root can mount» – но я root Соединение с Интернетом (ADSL), похоже, не работает на Arch Двойная загрузка Windows 10 и Scientific Linux 7 Почему псевдоним внутри функции не работает? Как узнать, работает ли sshd с ClientAliveInterval> 0? Почему два файла .flac, которые, как утверждается, содержат одни и те же данные, сильно различаются по размеру? синтаксическая ошибка возле неожиданного токена `do Как «забыть» учетные данные пользователя после входа в общий ресурс Windows (samba) Всплеск Плимута не работает и вызывает проблемы VT Сколько оперативной памяти, дискового пространства и времени процессора используется скриптом Как я могу перечислить доступные видеорежимы для моего экрана? Разрешение по умолчанию при установке USB-диска Автоматизация поиска изображений Google ssh-сессия никогда не выходит из строя

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

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

  • Имя файла 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' \; 

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

У вас есть хорошая база для начала. Если вы изменили содержимое своего -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' \{\} +