Пользовательская функция для перехода к ближайшему каталогу с заданным именем.

Вариант 1

Если вы хотите разбить на пустые строки,

awk '{printf $0; printf ($0=="")? "\n" : " "}' /path/to/file.txt

Пояснение

  • printf $0:распечатать текущую строку (без новой строки)
  • printf ($0=="")? "\n" : " ":Если текущая строка пуста ($0=="")?, то вывести новую строку "\n", иначе вывести пробел " ".
  • Н.Б. это печатает конечный пробел в последней строке, что может быть или не быть проблемой для вас.

Вариант 2

Однако, если вы просто хотите разбить каждую третью строку,

awk '{printf $0; printf (NR%3=="0")? "\n" : " "}' /path/to/file.txt

Пояснение

  • (NR%3=="0"):здесь условные тесты, если номер строки NRпо модулю 3равен нулю. то есть он будет печатать новую строку каждые три строки ввода, иначе просто напечатать пробел.
2
28.08.2019, 14:52
1 ответ

Попробуйте это,

cdd(){
depth=$(pwd | tr -dc '/' | wc -c)
for ((d=0;d<=depth;d++)); do
    [ $d -eq 0 ] && search_dir="." || search_dir=$(printf '../%.0s' $(seq 1 $d))
    res=( )
    while IFS= read -r -d '' item; do
        res+=( "$item" )
    done < <(find $search_dir -mindepth 1 -maxdepth 1 -type d -name "$1" -print0)
    if [ ${#res[@]} -eq 0 ]; then
        continue
    elif [ ${#res[@]} -eq 1 ]; then
        t="$res"
    elif [ ${#res[@]} -gt 1 ]; then
        select t in "${res[@]}"; do
            break
        done
    fi
    echo "$t"
    cd "$t" && return || { echo "Unknown Error"; return; }
done
echo "Not found"
}

Для каждого цикла он будет искать еще одну папку вверх по дереву, пока не будет достигнута $depth, что эквивалентно корневой папке /.

Использование:cdd targetname

Пример:

$ cdd home
../../../home

Если найдено несколько каталогов, появится меню select.

$ cdd "D*"
1)../Documents
2)../Downloads
3)../Desktop
#? 2
../Downloads
0
27.01.2020, 22:24

Теги

Похожие вопросы