Unix "найти" использование команды - PullRequest
2 голосов
/ 28 октября 2011

Это для скрипта установки bash.Скрипт foo.sh принимает "DIRECTORY" в качестве аргумента.Скажем, существует каталог <$HOME>/TEST/TEST_1A/TEST_2A/TEST_3 и другой каталог <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3.

Сценарий: кратко foo.sh.

DIR='find $HOME -type d -name $1 | head 1'
if [ DIR is set to a directory ]
then
   rm -rf $DIR
fi
exit 0

Использование: foo.sh TEST_3

Теперь из скрипта можно удалить только <$HOME>/TEST/TEST_1A/TEST_2A/TEST_3.Чтобы удалить <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3, мне нужно использовать reg exp в моей команде find для точной настройки удаления, чтобы разрешить конфликт каталогов.

Изменена часть поиска скрипта выше, как показано ниже

DIR='find $HOME -type d -regexp $1 | head 1'

Новое использование: foo.sh TEST_2B/TEST_3

Но команда «найти» НЕ ПОЛУЧАЕТ получить DIR значение <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3 и вместо этого возвращает пустое, и в результате DIR пусто, и я никогда не смогукогда-либо удалить <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

Как мне изменить скрипт, чтобы find мог воздействовать как на имя каталога, так и на путь к каталогу, тоже без проблем.На самом деле, некоторые пользователи могут указывать частичный путь к каталогу в качестве аргумента «foo.sh».Я ожидаю, что "foo.sh" будет работать, даже в таких случаях

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Вы можете попробовать:

if [[ "$1" == */* ]]; then
    EXPR="-path *$1"
else
    EXPR="-name $1"
fi
DIR=$(find $HOME -type d $EXPR | head -1)

Простое имя, такое как "TEST_3", будет переводиться в find -name TEST_3, но имя с косой чертой, такое как "ST_2 / TEST_3", будет переводиться в find -path *ST_2/TEST3. Это позаботится о (частичных) именах каталогов.

0 голосов
/ 28 октября 2011

Разве это не сработает, как задумано?

find $HOME -type d -name $1 -exec echo {} ';'  -exec rm -rf {} ';'

Он будет жаловаться на удаление обработанной директории, но с выводом некоторых stderr это нормально ...

Вы можете изменить «-name» на «-regexp», как вы предложили, но если вы хотите что-то более сложное, вы можете создать специальный скрипт для вызова из «-exec»

EDIT: Я, наверное, в первый раз понял, что вы не правы (но ничего не удалите, это может кому-то помочь) - вы хотите удалить только один из каталогов TEST_3 (как вы выбираете, какой из них - сначала найден поиском? - это кажется довольно странным), Тем не менее, как я и предлагал в предыдущем абзаце, вы можете предоставить скрипт для -exec, который позаботится о принятии решений)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...