2013-03-23 4 views
2

Я хочу найти папки по их имени, которые я знаю, и это распространено среди таких папок. я использовал «найти» команду в Баш скрипт, как этотКак удалить первую и последнюю папку в результатах поиска «Найти»?

find . -type d -name "*.hg" 

это просто распечатать весь путь от текущего каталога самой найденной папки. имя foldr имеет «.hg». Затем я попытался использовать команду «sed», но я не мог адресовать последнюю часть пути. Я решил, что имя папки заканчивается на .hg, сохраните ее в переменной, а затем используйте команду «sed», чтобы удалить последний каталог из вывода. Я использую это, чтобы получить последнюю часть, и попытаюсь сохранить результат в переменную, не повезло.

find . -type d -name "*.hg"|sed 's/*.hg$/ /' 


find . -type d -name "*.hg"|awk -F/ '{print $NF} 

это просто распечатать имена файлов, вот папка с .hg в конце. тогда я использовать другой подход

for i in $(find . -type d -name '*.hg'); 
do 
    $DIR = $(dirname ${i}) 
    echo $DIR 
done 

это didin't работать ни. может ли кто-нибудь указать мне какой-либо намек на то, чтобы это сработало. и да, это домашнее задание.

ответ

1

Вы можете использовать parameter expansion:

d=path/to/my/dir 

d="${d#*/}" # remove the first dir 
d="${d%/*}" # remove the last dir 
echo $d  # "to/my" 
+0

Я использовал ваш код и применил к своей работе, как этот $ j для i в $ (find. -type d -name '* .hg'); do \t $ j = "$ {i%/*}"; \t echo $ j; сделано; он показывает, что вывод я хотел, но с ошибкой: нет такого файла или каталога. – Pamador

+0

Я хотел проголосовать за @eugene, но моя репутация низкая. Я тоже использовал этот код: find. -type d -name '* .hg' | xargs sed 's/*. hg $// g'. но показал мне ошибку. \. \ .. test.hg - это каталог. действительно * .hg - это папка – Pamador

+0

@Pamador: '$ j =" $ {i% /} "' неверно, вы хотите 'j =" $ {i% /} "' –

0

одна проблема, которая у вас есть с шаблоном, который вы используете в вашем SED сценарий - есть другой язык шаблон, используемый как Баш и команды поиска.

Они используют очень простой язык регулярных выражений, где * означает любое количество символов и? означает любой символ. Команда sed использует гораздо более богатый язык регулярных выражений, где * означает любое число предыдущего символа и. означает любого персонажа (для этого есть намного больше).

Так, чтобы удалить последний компонент пути поставляемого найти вам необходимо будет использовать следующую команду: патч в СЕПГ -e «s,/[^ /] рт.ст. ,,»

В качестве альтернативы можно использовать команда dirname. Направьте вывод команды находки xargs (который будет выполнять команду прохождения стандартного ввода в качестве аргументов команды:..

xargs -i Dirname

@Pamador - это странно Это работает для меня просто объяснить : команда sed должна быть указана в одинарных кавычках только для защиты от любых нежелательных расширений оболочки. Символ, следующий за «s», является запятой, а то, что мы здесь делаем, - это изменение характера, который использует sed для разделения двух частей замените команду, это означает, что мы можем использовать символ косой черты без необходимости избегать ее без предшествующего обратного слэша. Следующая часть соответствует любой последовательности символов, кроме косой черты, за которой следует любой символ, а затем hg. Честно говоря, я должен был привязать шаблон до конца строки с $, но кроме этого это прекрасно.

Я тестировал его с

echo "./abc/xxx.hg" | sed -e 's,/[^/]\.hg$' 

И напечатанное ./abc

ли я понять то, что вы хотели сделать?

+0

благодарит вас за ответ, я попробовал «sed», который вы предоставили, но он не работал. является убирателем после 's', или. Я пробовал все возможности. ,/но это не дало результата, которого я хотел. – Pamador

+0

Я пробовал именно это и дал мне error.sed -e выражение # 1, команду char 12 unterminated 's'. Я знаю, что forslash - это разделитель, сначала это текст, который нужно найти, а второй - текст для замены. Я не понимаю, что делает (,) здесь? – Pamador

+0

Простите, что перед запятой была пара недостающих запятых. Первый символ после s - это разделитель команд. Обычно это/но использование запятой позволяет избежать проблемы «наклоняющейся зубочистки», когда вам нужно избегать слешей в шаблоне с обратными косыми чертами – Nick

0
find . -type d -name "*.hg" | awk -v m=1 -v n=1 'NR<=m{};NR>n+m{print line[NR%n]};{line[NR%n]=$0}' 

параметры AWK:

  • м = количество строк, чтобы удалить с начала вывода
  • п = количество линий, чтобы удалить из конца вывода

бонус: Если вы хотите удалить 1 строку с конца, и у вас установлена ​​программа coreutils, вы можете сделать это: find . -type d -name "*.hg" | ghead -n -1

Смежные вопросы