Ваш скрипт действительно беспорядок, и имейте в виду, что вы НИКОГДА не должны анализировать имена файлов (например, вывод из ls
или find
без опции -print0
). См. Подводные камни Bash # 1 .
Кроме того, я думаю, что проблема в том, что в вашем цикле вы усекаете имена файлов, выводимые из find
, с помощью basename
, но затем вызываете tail
с базовым именем файла в качестве аргумента, где файл действительно не является ' t находится в текущей папке.
Я не понимаю, что вы там делаете, но это более правильный код, который, возможно, делает то, что вам нужно:
find "$1" -type f -name "$2" -print0 | while read -d '' name
do
filename=`basename "$name"`
tail -1 "$name" | sed "s/Z/Z|$filename/" >> "$3"
echo "$filename"
done
Но все же в этом сценарии есть подводные камни. Вероятно, произойдет сбой при вводе странных имен файлов из find
. Например, если ваше имя файла содержит символы, которые являются специальными для sed
. Или если в какой-то момент $filename
будет --help
и т. Д .etc.etc.