Похоже, что ловушка ERR выполняется потому, что функция FuncA имеет ненулевой статус выхода. Как описано в man bash
статус выхода функции - это статус выхода последней команды, выполненной в теле.
Которая, в данном случае, была [[ -d mydir2 ]]
. Вы можете добавить true
в качестве последней команды в функции, чтобы предотвратить это.
Конструкция if
отличается, потому что (то же руководство):
Статус выхода - это статус выхода последней выполненной команды, или ноль, если ни одно условие не подтвердилось.
Я бы рекомендовал использовать if
, а не добавлять true
.
Использование GNUfind
:
find "$PWD" -type f -printf '%f %h/%f\n'
%f
Имя файла с удаленными начальными каталогами (только последний элемент ). %h
Начальные каталоги имени файла (все, кроме последнего элемента ). Если имя файла не содержит косых черт (, так как он находится в текущем каталоге ), спецификатор %h заменяется на `.'. Вы можете использовать следующую команду для поиска файлов по их абсолютным путям. Например. Я пытаюсь найти файлы.sh с помощью cmd следующим образом:
find. -type f -iname "*.sh"
Следующий однострочник bash создаст желаемый результат
for f in $(find $(pwd) -type f); do echo "$(basename $f) $(realpath $(dirname $f))"; done
Пояснение:for _ in _ ; do _ ; done
перебирает то, что нашла ваша команда basename
удаляет из пути все, кроме последней части (ака. имя файла)dirname
делает наоборот realpath
возвращает фактический путь (, поэтому вы не получите .
для файла в cwd)
Если вы часто используете это, я предлагаю использовать псевдоним для более короткой команды.
Со стандартнымfind
:
find "$PWD" -type f -exec sh -c '
for pathname do
printf "%s\t%s\n" "${pathname##*/}" "$pathname"
done' sh {} +
Это напечатает список всех файлов, разделенных табуляцией -, в текущем каталоге или ниже него. Первый столбец будет содержать имя файла, а второй столбец будет содержать путь к файлу относительно абсолютного пути текущего каталога ($PWD
в пути поиска ).
Это делается путем подачи пакетов найденных путей к короткому -строковому сценарию, который просто выводит имена в предпочтительном формате. Подстановка параметра ${pathname##*/}
расширяется до значения $pathname
с удалением всего до последнего /
.
Обратите внимание, что имена файлов, содержащие символы новой строки, будут представлены на нескольких строках, и будет трудно правильно различить имена файлов, содержащие символы табуляции -. Предполагая, что результат будет предназначен для просмотра, а не для анализа, это может быть нормально.
Используйте эту команду:
find $PWD -type f -printf '%f %h/%f/n'
или
Ищите какие-то файлы, а затем переходите к этому:
find $PWD -type f -iname "filenames" -printf '%f %h/%f/n'