Использование команды «Найти» в тандеме с операторами «если» и «и»

Я выпустил

ps aux | grep mtp

, который дал мне несколько процессов, связанных с mtp, и сравнил с установленной и отключенной камерой, чтобы получить конкретный процесс

, а затем

pkill -9 gvfsd-mtp

сделал свое дело.

Но я предполагаю, что приведенный выше ответ тоже будет работать:)

1
25.01.2017, 20:26
2 ответа

Немного длинное, но рабочее решение, которое должно работать в случаях, когда -execdir недоступен:

$ tree
.
├── dir_one
│   ├── password.old
│   └── webvirtual
└── dir_two
    └── password.old
$ find . -iname "*password.old" -exec dirname "{}" \; 2>/dev/null | while IFS= read -r directory; do
> [ -e "$directory"/webvirtual ] && continue || echo "$directory"
> done
./dir_two

Таким образом, все, что вам нужно сделать сейчас, это добавить > OLD.txt в конце оператора done для перенаправления вывода в файл

. Если команда dirname недоступна, вы можете использовать следующий сценарий с каталогом в качестве аргумента.

#!/bin/sh

find "$1" -type f -iname "*password.old"  -printf "%h\n" |
while IFS= read -r directory;
do
    [ -e "$directory"/webvirtual ] && continue || echo "$directory"
done

Например:

$ ./find_missing_webvirtual.sh ./TESTDIR/                                                                                
./TESTDIR/dir_two
1
27.01.2020, 23:19

Я бы сделал:

find . -path ./OLD -prune -o -name password.old \
  ! -execdir [ -e webvirtual ] \; -printf '%h\n'

-execdir находится в GNU find (начиная с 4.2.12 ( 2005)), sfind и большинство BSD (откуда это взялось). -printf специфичен для GNU. Вы можете заменить его на -execdir pwd \; для других реализаций find .

Если -execdir недоступен:

find . -path ./OLD -prune -o -name password.old -exec sh -c '
  for file do
    dir=${file%/*}
    [ -e "$dir/webvirtual" ] || printf "%s\n" "$dir"
  done' sh {} +

Выше будет POSIX. В Solaris 10 и старше обязательно используйте стандартный sh в / usr / xpg4 / bin , а не в / bin .

3
27.01.2020, 23:19

Теги

Похожие вопросы