Эта команда:
find ./ -name "mybinaryrpm-1.0.24-1.1.i586.rpm"
дает вывод:
./DirectoryName/SubDirectory/mybinaryrpm-1.0.24-1.1.i586.rpm
но я хочу только вывод:
mybinaryrpm-1.0.24-1.1.i586.rpm
Как я могу получить это?
Что я действительно пытаюсь сделать:
- Прочитайте входной файл, который содержит список двоичных имен файлов, разделенных строкой
- Поиск файлов с соответствующими именами в текущем каталоге рекурсивно
- Если найдено более одного совпадения, рассмотрите только один результат поиска и скопируйте файл в соответствующий каталог назначения.
Текущий код:
while read line; do
binaryRpm=$(find ./ -name "$line" -exec basename {} \;)
echo " [ Read From File: $line ] <==> [ Find Command Searched: $binaryRpm ]"
## If found then copy the binary file to dest dir
## TODO: If Find Command finds more than One File with the
## Same Name, then ONLY ONE FILE MUST be Compared and copied to
## the Release Directory
if [ "$line" != "$binaryRpm" ]; then
echo "---------- Binary File Searching---------- "
continue
else
echo " !!!!!! Binary File Found ==> $binaryRpm !!!!!! "
fi
done < "$FILENAME"
ubuntu-10.04
find
Sree
источник
источник
Ответы:
Что ж, ваш пример на самом деле не имеет смысла, так как вы, как отмечено в комментарии, хотите получить тот же результат, что и в качестве входных данных. Если вы знаете вход, вы уже знаете выход.
Но, в общем, используйте
find
«s-printf
функцию:От
man find
, раздел-printf
:Это доступно только для поиска GNU, но инструменты GNU - это стандарт Linux, который вы запрашивали. Он также может быть установлен на более или менее каждой соответствующей платформе.
Пример минимального кода, который делает то, что вы действительно пытаетесь сделать:
Комментарии к моему примеру выше:
head -1
останется только первый матч.[ -z ]
проверяет, является ли переменная пустой (она будет пустой, еслиfind
ничего не найдет выше).Комментарии к вашему сценарию:
find
вернут только те, которые совпадают. Я думаю, что вы используете его, чтобы отменить несколько матчей, ноhead
это лучший инструмент для этого.continue
операторе в том виде, в каком он есть, поскольку скрипт все равно выйдет изif
предложения и вfor
любом случае выполнит цикл сразу после этого.источник
find
подобное.Попробуйте эту команду:
источник
Чтобы ответить на ваш вопрос, вы можете попробовать что-то вроде этого:
find ./ -name "mybinaryrpm-1.0.24-1.1.i586.rpm" | sed 's|^\..*/\(.*\)|\1|g'
источник