Как перечислить директоров containg файл?

Я пытаюсь использовать, находят для списка директоров с определенным файлом внутри, но у моих директоров есть пробелы, таким образом, я не нашел решение.

0
задан 15.03.2011, 04:58

4 ответа

Принятие я действительно понимаю Ваш вопрос, имейте Вас попробованный:

find / -name "*what*" -exec dirname {} \;

Это работает на меня, даже если мои каталоги имеют пробелы:

root:~# find / -name "*what*" -exec dirname {} \;
/usr/share/man/id/man1
...
...
/usr/share/man/ja/man1
/usr/share/man/it/man1
/usr/share/man/man1
/usr/bin
/root/This is a Spaced Dir
1
ответ дан 24.11.2019, 12:01

Это - от мягкой фетровой шляпы .bashrc файл:

ff () {
       find . -name "*$@*" -print;
       }

Добавьте это к Вашему .bashrc и затем повторно инициализируйте свою оболочку удара

теперь можно использовать ff <whatever > \ <whatever>

\ escape-последовательность должна выйти из специальных символов.

0
ответ дан 24.11.2019, 12:01

POSIX диктует довольно слабое find (серьезно, это даже не имеет-print0). Аналогично, xargs не будет иметь -0 опция и IEEE 1003.1-2008 рассматривают xargs -I {} быть Системным расширением Интерфейса X/Open (которым и объявляет, что строка заменяет с аргументами, и преобразовывает xargs в использование новых строк для разделителей входного параметра). Таким образом принятие Вас на самом деле хочет сделать что-то с путями кроме распечатывания их и если можно только использовать основной POSIX, необходимо будет выйти из пробелов в строках прежде, чем передать их xargs, таким образом:

find /startingdir -name 'file name' -exec dirname {} \; | sed 's/ /\\ /g' | xargs command

Обратите внимание, что необходимо будет также выйти из кавычек и обратных косых черт, если у Вас будут каталоги, которые включают их. Это могло заменить команду sed:

sed -e 's/\\/\\\\/' -e 's/ /\\ /g' -e 's/"/\\"/g' -e "s/'/\\\\'/g"

(Отметьте дополнительные обратные косые черты на двойном заключенном в кавычки сценарии. Строковые обратные косые черты использования одинарной кавычки буквально, но строки двойной кавычки интерпретируют обратные косые черты, таким образом Ваша оболочка интерпретирует "\\\\" как \\ в котором sed нуждается для литерала \, в то время как '\\\\' интерпретируется как \\\\ в котором sed нуждается для литерала \\.) Это выйдет из существующих обратных косых черт сначала, затем выйдет из пробелов, двойные кавычки и одинарные кавычки.

Если можно использовать Системные расширения Интерфейса X/Open, то первая версия (никакие кавычки или обратные косые черты) упрощает до:

find /startingdir -name 'file name' -exec dirname {} \; | xargs -I {} command {}

Если у Вас будут кавычки и обратные косые черты в Ваших именах каталогов, то их должны будут все еще оставить как выше (но не выходя из пробелов).

Так или иначе, если у Вас есть новые строки в Ваших именах каталогов, затем у Вас есть большие проблемы, чем я могу помочь с.

Отредактированный для удаления версии удара, очищенной на основе входа от Dennis Williamson

0
ответ дан 24.11.2019, 12:01

zsh не моя предпочтительная оболочка, но для этой задачи **-function неукротимо:

zsh -c "'ls **/'the file name'"

Или даже:

zsh -c "ls **/*'file name'"
0
ответ дан 24.11.2019, 12:01

Теги

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