Есть ли способ показать «Файл не найден» или подобное сообщение при использовании команды `find`?


1

Я пытаюсь проверить наличие нескольких файлов, не зная заранее, где находятся файлы. Итак, я подумал, findчто это де-факто утилита для этого ... Она работает, как и ожидалось, но проблема в том, что она не подтверждает отсутствие файлов, то есть, если файл не существует в каталоге поиска тогда, как вы ожидаете, это не будет показано в результатах.

Я думаю, это нормально, так как findкоманда предназначена для поиска файлов, которые на самом деле существуют в первую очередь (d'oh). Но мне интересно, есть ли у команды способ findвернуть сообщение типа «Файл не найден» или тому подобное, чтобы сообщить, что файла нет, вместо того, чтобы молча провалиться (или преуспеть).

Я подумал, что, возможно, я мог бы обойти проблему, используя findкод возврата путем запроса $?, но даже когда файл не найден, код возврата есть 0.

Просто пример того, что у меня есть ...

find . -name foo.sh 
find . -name bar.sh 

и что он возвращает в случае, если единственный файл там foo.sh:

./directory/foo.sh

То, что я хотел бы получить:

./directory/foo.sh
bar.sh not found

Кто-нибудь знает findфлаг или любой другой обходной путь, который я могу использовать?
Спасибо!

Ответы:


0

Вы можете попытаться find . -name foo | grep \/установить код выхода.

grep ищет любые / в выходных данных и возвращает код выхода 1, если ничего не найдено


Genius! Я могу использовать: find . -name foo | grep \/ || echo "File not found". Спасибо!
jimm-cl

2

Я не думаю, что у find есть возможность сказать « то, что вы искали, не было найдено ».

Вы можете посчитать количество строк, возвращаемых функцией find, и, если оно равно 0, вывести сообщение «not found». Что-то вроде:

#/bin/bash

# put find output to a temp file
find . -name 'foo.sh' > /var/tmp/find.tmp.$$

# count the number of lines
COUNT=`wc -l /var/tmp/find.tmp.$$ | awk '{ print $1 }'`


if [ $COUNT -eq 0 ]
then
   # find didn't return any results, so print message
   echo "foo.sh not found"
else
   # find returned results, print them
   cat /var/tmp/find.tmp.$$
fi
# remove temp file
rm /var/tmp/find.tmp.$$

Он выведет вывод команды find, если были какие-либо результаты, или « foo.sh not found », если результатов не найдено.


Звучит как хорошая идея, если вы хотите создать оболочку find, но в этом случае я просто хотел простой однострочной, просто чтобы знать, что файла нет. +1 в любом случае, потому что, как я уже сказал, это хорошая идея. Спасибо!
Джимм-кл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.