如何使定位输出看起来像`ll`或`ls -la`但更好?

locate命令输出有点平淡:

$ time locate etc/profile /etc/profile /etc/profile.d /etc/profile.d/appmenu-qt5.sh /etc/profile.d/apps-bin-path.sh /etc/profile.d/bash_completion.sh /etc/profile.d/cedilla-portuguese.sh /etc/profile.d/jdk.csh /etc/profile.d/jdk.sh /etc/profile.d/vte-2.91.sh real 0m0.696s user 0m0.671s sys 0m0.024s 

我怎样才能像llls -la那样提供更多信息呢? 也许还包括标题?

使用xargsls

 $ locate -0 etc/profile | xargs -0 ls -ld -rw-r--r-- 1 root root 575 Oct 23 2015 /etc/profile drwxr-xr-x 2 root root 4096 Apr 20 10:10 /etc/profile.d -rw-r--r-- 1 root root 40 Nov 30 2015 /etc/profile.d/appmenu-qt5.sh -rw-r--r-- 1 root root 663 May 18 2016 /etc/profile.d/bash_completion.sh -rw-r--r-- 1 root root 1003 Dec 29 2015 /etc/profile.d/cedilla-portuguese.sh -rwxr-xr-x 1 root root 31 Oct 18 2017 /etc/profile.d/go.sh -rwxr-xr-x 1 root root 301 Feb 20 2013 /etc/profile.d/jdk.csh -rwxr-xr-x 1 root root 299 Feb 20 2013 /etc/profile.d/jdk.sh -rw-r--r-- 1 root root 999 Aug 23 2017 /etc/profile.d/libvirt-uri.sh -rw-r--r-- 1 root root 1941 Mar 16 2016 /etc/profile.d/vte-2.91.sh -rw-r--r-- 1 root root 1557 Apr 15 2016 /etc/profile.d/Z97-byobu.sh 

llocate ,我创建了一个名为llocate的脚本:

 $ time llocate etc/profile ACCESS OWNER GROUP SIZE MODIFIED NAME (updatdb last ran: 2018-07-01 11:30:05) -rw-r--r-- root root 575 Nov 12 2017 /etc/profile drwxr-xr-x root root 4096 Jun 4 17:19 /etc/profile.d -rw-r--r-- root root 40 Feb 16 2017 /etc/profile.d/appmenu-qt5.sh -rw-r--r-- root root 580 Oct 18 2017 /etc/profile.d/apps-bin-path.sh -rw-r--r-- root root 663 May 18 2016 /etc/profile.d/bash_completion.sh -rw-r--r-- root root 1003 Dec 29 2015 /etc/profile.d/cedilla-portuguese.sh -rwxr-xr-x root root 301 Feb 20 2013 /etc/profile.d/jdk.csh -rwxr-xr-x root root 299 Feb 20 2013 /etc/profile.d/jdk.sh -rw-r--r-- root root 1941 Mar 16 2016 /etc/profile.d/vte-2.91.sh real 0m0.760s user 0m0.754s sys 0m0.020s 

运行需要.76秒而常规locate命令需要.76秒。 差异可以忽略不计。


Bash脚本

bash代码非常简单。 将下面的脚本复制到目录/home/YOUR_NAME/bin (您可能必须先创建它)或/usr/local/bin并使用以下命令将其标记为可执行文件:

 chmod a+x /home/YOUR_NAME/bin/llocate` 

这是脚本llocate

 #!/bin/bash # NAME: llocate # PATH: /mnt/e/bin # DATE: May 22, 2018. Modified July 1, 2018. # DESC: Use locate command but format output like `ll` with headings # PARM: Parameter 1 = locate search string # UPDT: 2018-07-01 Format date with Time or Previous Year like `ls -al`. if [[ $# -eq 0 ]]; then echo "First parameter must be full or partial file names to search for." exit 1 fi # Create unqique temporary file names tmpLine=$(mktemp /tmp/llocate.XXXXX) tmpForm=$(mktemp /tmp/llocate.XXXXX) # Function Cleanup () Removes temporary files CleanUp () { [[ -f $tmpLine ]] && rm -f $tmpLine # Remove temporary files created [[ -f $tmpForm ]] && rm -f $tmpForm # at various program stages. } locate "$1" > $tmpLine # Was anything found? if [[ ! -s $tmpLine ]] ; then echo "No files found. If files created today, did you run 'sudo updatedb' after?" CleanUp exit 1 fi LastRun=$(stat --printf=%y /var/lib/mlocate/mlocate.db | sed 's/\.[^\n]*//') # Build output with columns separated by "|" echo "ACCESS|OWNER|GROUP|SIZE|MODIFIED|NAME (updatdb last ran: $LastRun)" \ > $tmpForm while read -r Line; do StatLine=$(stat --printf='%A|%U|%G|%s|%Y|%N\n' "$Line" | sed 's/ [^|]*//' | \ sed "s/'//g") IFS="|" Arr=($StatLine) Seconds="${Arr[4]}" # Format date with time if it's this year, else use file's year if [[ $(date -d @$Seconds +'%Y') == $(date +%Y) ]]; then HumanDate=$(date -d @$Seconds +'%b %_d %H:%M') else HumanDate=$(date -d @$Seconds +'%b %_d %Y') fi StatLine="${StatLine/$Seconds/$HumanDate}" echo "$StatLine" >> $tmpForm done < $tmpLine # Read next locate line. cat $tmpForm | column -t -s '|' CleanUp exit 0 
Interesting Posts