2015-02-13 4 views
1

Довольно часто мне нужно работать с новейшим файлом в каталоге.Bash: передать псевдоним или функцию в качестве аргумента для программы

Обычно я делаю:

ls -rt 

, а затем открыть последний файл в Vim или меньше.

Теперь я хотел произвести псевдоним или функции, как

lastline() {ls -rt | tail -n1} 
# or 
alias lastline=$(ls -rt | tail -n1) 

Вызов lastline выводит новый файл в каталоге, что приятно. Но вызов

less lastline 

хочет открыть файл «lastline», который не существует.

Как заставить bash выполнить функцию или псевдоним, если возможно, без большого набора символов $() или ``? Или есть ли другой способ добиться такого же результата?

Благодарим за помощь.

ответ

2

Вы разборе ls, и это очень плохо. Более того, если последний измененный «файл» является каталогом, вы будете less ing/vim в каталоге.

Так что вам нужен надежный способ определения последнего измененного файла в текущем каталоге. Вы можете использовать вспомогательную функцию, как следующее (что вы будете положить в .bashrc):

last_modified_regfile() { 
    # Finds the last modified regular file in current directory 
    # Found file is in variable last_modified_regfile_ret 
    # Returns a failure return code if no reg files are found 
    local file 
    last_modified_regfile_ret= 
    for file in *; do 
     [[ -f $file ]] || continue 
     if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then 
      last_modified_regfile_ret=$file 
     fi 
    done 
    [[ $last_modified_regfile_ret ]] 
} 

Затем вы можете определить другую функцию, которая будет vim последний найденный файл:

vimlastline() { 
    last_modified_regfile && vim -- "$last_modified_regfile_ret" 
} 

Возможно, у вас может быть last_modified_regfile необязательные аргументы: в каталогах, где он найдет последний измененный обычный файл:

last_modified_regfile() { 
    # Finds the last modified regular file in current directory 
    # or in directories given as arguments 
    # Found file is in variable last_modified_regfile_ret 
    # Returns a failure return code if no reg files are found 
    local file dir 
    local save_shopt_nullglob=$(shopt -p nullglob) 
    shopt -s nullglob 
    (($#)) || set . 
    last_modified_regfile_ret= 
    for dir; do 
     dir=${dir%/} 
     [[ -d $dir/ ]] || continue 
     for file in "$dir"/*; do 
      [[ -f $file ]] || continue 
      if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then 
       last_modified_regfile_ret=$file 
      fi 
     done 
    done 
    $save_shopt_nullglob 
    [[ $last_modified_regfile_ret ]] 
} 

Тогда вы можете даже изменить vimlastline соответственно:

vimlastline() { 
    last_modified_regfile "[email protected]" && vim -- "$last_modified_regfile_ret" 
} 
+0

Спасибо - за Примеры. Впечатляющая часть кода :) – sargas

+1

@sargas Рад, что это помогло. Теперь вы должны изучить его, чтобы учиться столько, сколько сможете от него! удачи ':)'. –

0

Используйте команду подстановки, как это:

lastline() { ls -rt | tail -n1; } 
less "$(lastline)" 

Или труба это xargs:

lastline | xargs -I {} less '{}' 
+0

[Подробнее о подстановки команд] (http://www.tldp.org/LDP/abs/html/commandsub.html) – anubhava

Смежные вопросы