Вывести только часть после последней «/» с find

-1

Эта команда:

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

Как я могу получить это?


Что я действительно пытаюсь сделать:

  1. Прочитайте входной файл, который содержит список двоичных имен файлов, разделенных строкой
  2. Поиск файлов с соответствующими именами в текущем каталоге рекурсивно
  3. Если найдено более одного совпадения, рассмотрите только один результат поиска и скопируйте файл в соответствующий каталог назначения.

Текущий код:

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"
Sree
источник
3
Вы хотите извлечь точно такую ​​же строку, которую вы вводите?
Маттео
-1 Так устал от вводящих в заблуждение вопросов ...
Даниэль Бек

Ответы:

2

Что ж, ваш пример на самом деле не имеет смысла, так как вы, как отмечено в комментарии, хотите получить тот же результат, что и в качестве входных данных. Если вы знаете вход, вы уже знаете выход.

Но, в общем, используйте find«s -printfфункцию:

find . -name "mybinaryrpm-1.0.24-1.1.i586.rpm" -printf '%f\n'

От man find, раздел -printf:

%f    File's name with any leading directories removed (only the last element).

Это доступно только для поиска GNU, но инструменты GNU - это стандарт Linux, который вы запрашивали. Он также может быть установлен на более или менее каждой соответствующей платформе.


Пример минимального кода, который делает то, что вы действительно пытаетесь сделать:

#!/bin/sh
FILENAME="/path/to/file/with/filenames"

while read line; do
    binaryRpm=$(find -name "${line}" -type f | head -1)
    if [ -z "${binaryRpm}" ]; then
        echo "No matches found for \"${line}\"."
    else
        echo "Match for \"${line}\" found at \"${binaryRpm}\""
    fi
done < "${FILENAME}"

Комментарии к моему примеру выше:

  • head -1 останется только первый матч.
  • [ -z ]проверяет, является ли переменная пустой (она будет пустой, если findничего не найдет выше).

Комментарии к вашему сценарию:

  • Вам не нужно проверять, совпадает ли имя файла со строкой, поскольку findвернут только те, которые совпадают. Я думаю, что вы используете его, чтобы отменить несколько матчей, но headэто лучший инструмент для этого.
  • Вы не нуждаетесь в continueоператоре в том виде, в каком он есть, поскольку скрипт все равно выйдет из ifпредложения и в forлюбом случае выполнит цикл сразу после этого.
Даниэль Андерссон
источник
Мне очень приятно получить ваши замечания и ответить, сэр. Искреннее спасибо ^^
sree
[Дополнительный вопрос] ** Но приведенная выше команда поиска ищет и печатает более одного файла с одинаковым именем. Мне нужен только один файл из результатов поиска, чтобы сравнить результат команды поиска с результатом чтения имени файла из файла. Ваши ценные комментарии и ответы действительно очень
заметны
@sree: Вам нужно обновить свой вопрос информацией о том, что вы действительно пытаетесь сделать. Для нас очень неэффективно продолжать догадываться, и вполне вероятно, что есть лучший способ, чем использовать findподобное.
Даниэль Андерссон
Шаги, которым я пытаюсь следовать
сри
Шаги, которым я пытаюсь следовать, 1. Входной файл имеет список имен двоичных файлов 2. Считывание файла построчно для списка имен двоичных файлов 3. Поиск прочитанного имени двоичного файла в текущем каталоге или во всех каталогах 4 Сравните файл поиска с именем двоичного файла в файле 5. Если результат поиска содержит более одного, то рассмотрите только один результат поиска и скопируйте файл в соответствующий каталог назначения.
Сри
0

Попробуйте эту команду:

find . -name "mybinaryrpm-1.0.24-1.1.i586.rpm" -exec basename {} \;
кэв
источник
Мне очень приятно получить ваши замечания и ответить, сэр. Искреннее спасибо ^^
sree
[Дополнительный вопрос] ** Но приведенная выше команда поиска ищет и печатает более одного файла с одинаковым именем. Мне нужен только один файл из результатов поиска, чтобы сравнить результат команды поиска с результатом чтения имени файла из файла. Ваши ценные комментарии и ответы действительно очень
заметны
0

Чтобы ответить на ваш вопрос, вы можете попробовать что-то вроде этого:

find ./ -name "mybinaryrpm-1.0.24-1.1.i586.rpm" | sed 's|^\..*/\(.*\)|\1|g'

ortang
источник