Код, который вы пытаетесь использовать, предназначен для тела функции;вызов функции устанавливает $1
правильно.Само по себе $1
, вероятно, не установлено, и поэтому find
операторы на ""/
(так же, как /
), а не top_dir
.
new_cd () {
cd "$( find "$1"/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"
}
new_cd top_dir
Это можно немного упростить,Нет необходимости использовать find
или xargs
;простой цикл будет делать.А так как у вас есть функция, теперь нет необходимости втискивать все в одну строку.
new_cd () {
new_d=$(for d in "$1"/*/; do
stat -c "%Y %n" "$d" 2> /dev/null
done | sort -nr |
head -n |
cut -d " " -f 2-)
cd "$new_d"
}
У этого есть один незначительный недостаток: подстановка команды сожрет любые завершающие символы новой строки в выводе cut
, поэтомуубедитесь, что ни одно из имен каталогов не заканчивается символом новой строки.(Эта чрезвычайно незначительная ошибка может быть исправлена, но, вероятно, не стоит этого делать; просто помните об этом.)
У нее также есть больший недостаток: так как не -следующие символы новой строки не съедено, вы не можете предполагать, что вывод цикла состоит из ровно одного файла в строке;один файл может занимать несколько строк.Самое простое решение - избегать имен каталогов с символами новой строки.Более надежное исправление отменяет конвейер.
new_cd () {
local newest_time newest_d
for d in "$1"/*/; do
t=$(stat -c "%Y" "$d")
if (( t > newest_time )); then
newest_time=$t
newest_d=$d
fi
done
cd "$newest_d"
}