Как найти базовое имя пути через канал - PullRequest
0 голосов
/ 09 июня 2019

Это не работает:

find "$all_locks" -mindepth 1 -maxdepth 1 -type d | basename

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

Ответы [ 3 ]

1 голос
/ 09 июня 2019

Поскольку mindepth и maxdepth являются расширениями GNU, использование другого, такого как printf, не сделает его менее переносимым.

find "$all_locks" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
1 голос
/ 09 июня 2019

Чтобы применить команду к каждому результату конвейерной операции, xargs - ваш друг.Как сказано в справочной странице, на которую я ссылался ...

xargs читает элементы из стандартного ввода, разделенные пробелами (которые могут быть защищены двойными или одинарными кавычками или обратной косой чертой) или символами новой строки, ивыполняет команду (по умолчанию / bin / echo) один или несколько раз с любыми начальными аргументами, за которыми следуют элементы, считанные из стандартного ввода.

В этом случае это означает, что каждый результат будет получен из вашего find введите команду и выполните basename <find result> ad nauseum, пока команда find не завершит поиск.Я верю, что то, что вы хотите, будет выглядеть примерно так:

find "$all_locks" -mindepth 1 -maxdepth 1 -type d | xargs basename

0 голосов
/ 09 июня 2019

Проблема в том, что basename не принимает stdin и, следовательно, неназванные каналы могут быть бесполезны.Я хотел бы немного изменить вашу команду.Дайте мне знать, если это служит цели.

find -mindepth 1 -maxdepth 1 -type d -exec basename {}  \;

Примечание: недостаточно репутации, чтобы комментировать, поэтому разместите ее здесь.

...