如何通过自定义列扩展 ls 命令

如何通过自定义列扩展 ls 命令

我想知道是否可以ls -l通过自定义列修改命令。

例如,我希望此列包含每个文件,例如$(CustomCommand FILE).

答案1

这是一个非常基本的概念证明。不是特别健壮(例如带有空格的文件名会破坏它),但可以理解这个想法。

$ export CustomCommand=file
$ alias ls=/tmp/test/myls
$ ls
a  b  c  myls
$ ls -l
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 a a: empty
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 b b: empty
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 c c: empty
-rwxr-xr-x 1 steve steve 127 Sep 22 19:18 myls myls: POSIX shell script,     ASCII text executable
$ cat /tmp/test/myls
#!/bin/sh
if [ "$1" = "-l" ]
then
 shift
 ls -l $* | awk 'NF>2{ printf "%s ",$0 ; system("$CustomCommand " $NF) }'
else
 ls $*
fi
$

答案2

这是一种将paste、sed、ls 组合在一起并将其保存到bashrc 的方法。它有两个主要部分:

  • 这里的“custom_command”接受参数,但仅在传递给它的每个参数前面加上“YYY”并附加“ZZZ”,OP的实际CustomCommand当然会做一些不同的事情
  • 名为“ls1”的别名,其中包括调用 custom_command。将其命名为“ls1”以避免与“ls”冲突,因为我们仍然依赖“ls”

所以在你的 ~/.bashrc 中,添加:

custom_command ()
{
    for i; do
        echo "YYY${i}ZZZ"
    done
}

alias ls1='paste <( ls -lh | sed 1d ) <( custom_command * )'

然后. ~/.bashrc使其在当前终端生效。

如果当前目录包含'dir1''file1''file2'和'file 3'(测试带有空格的文件),您可以运行别名ls1并看到:

$ ls1
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1   YYYdir1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1  YYYfile1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2  YYYfile2ZZZ
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3 YYYfile 3ZZZ

解释

custom_command ()
{
    for i; do
        echo "YYY${i}ZZZ"
    done
}
  • 如果for i不进一步指定任何内容,将导致 for 循环使用位置参数
  • 大括号是区分 i 变量所必需的,否则 bash 会将 $iZZZ 误解为变量

输出示例:

$ custom_command a b c
YYYaZZZ
YYYbZZZ
YYYcZZZ

*与bash 扩展一起使用时:

$ custom_command *
YYYdir1ZZZ
YYYfile1ZZZ
YYYfile2ZZZ
YYYfile 3ZZZ

“ls -lh”通常会执行以下操作:

$ ls -lh
total 16K
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3

使用sed,1表示第1行,d表示删除,删除第一行:

$ ls -lh | sed 1d
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3

程序paste和过程替换<(...)是将这些原本独立的输出组合起来的关键。粘贴通常需要文件作为参数,例如paste data1 data2.我们使用 bash 的进程替换,因此命令的输出将显示为粘贴为它可以使用的普通文件,因此:

$ paste <( ls -lh | sed 1d ) <( custom_command * )
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1   YYYdir1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1  YYYfile1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2  YYYfile2ZZZ
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3 YYYfile 3ZZZ

使用 bashrc 只是保存此命令,以便在新终端或运行. ~/.bashrc重新加载 bash 的现有终端中方便地重复使用。

相关内容