Я хочу отобразить все каталоги, которые не содержат файлы с определенным окончанием файла. Поэтому я попытался использовать следующий код:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
В этом примере я хотел отобразить все каталоги, которые не содержат файлы с окончанием .ENDING
, но это не работает.
Где моя ошибка?
Ответы:
Вот решение в три этапа:
источник
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
Вот так!
Или поочередно (и более питонично):
Бонус DLC Контент!
Исправленная (в основном) версия команды find:
источник
test: ...: binary operator expected
если*.ENDING
в каталоге несколько файлов.next(filter(lambda x: x.endswith('.ENDING'), filenames))
также могут быть написаны с использованием генератора понимания , т.е.next(x for x in filenames if x.endswith('.ENDING'))
.if not any(x.endswith('.ENDING') for x in filenames)
основанное на том факте, что любой возвратFalse
для пустой итерации.Оболочка расширяет
*
, но в вашем случае оболочка не задействована, только команда test, выполняемая find . Следовательно, файл, существование которого проверено, буквально назван*.ENDING
.Вместо этого вы должны использовать что-то вроде этого:
Это приведет к расширению sh
*.ENDING
при выполнении теста .Источник: найти глобус на UX.SE
источник
-c: line 0: syntax error near unexpected token
('`. Мои имена каталогов имеют формат' xyz (dfdf) '. На самом деле это библиотека калибров.sh: line 0: test: foo1/bar.ENDING: binary operator expected
каталог, содержащий файл с окончаниемENDING
.sh: -c: line 0: syntax error near unexpected token
('sh: -c: строка 0:' test -e test (test) / *. End '). / тест (тест) `Но когда я изменяю .ending к .xyz я получаю тот же результат Это потому , что у меня есть прицветники как имя каталога, право Как я могу исправить это..?Вдохновленный ответами Денниса Нольте и MikeyB , я придумал это решение:
Работает исходя из того что
Кстати, именно поэтому stderr был перенаправлен на
/dev/null
.источник
Я бы сделал это в Perl лично
Должен сделать свое дело (работает на моем очень упрощенном тестовом примере).
источник
Вот находка с одним вкладышем.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u
Изменить : Ой, не будет работать.
источник
q
в егрепе для тишиныС помощью которого
egrep
вы можете поменять регулярное выражение, которое вам нужноls -1 "{}"
выводит имена файлов из команды поискаисточник