사용자 정의 열을 사용하여 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는 물론 다른 작업을 수행합니다.
  • custom_command에 대한 호출을 포함하는 "ls1"이라는 별칭. 우리는 여전히 "ls"에 의존하므로 "ls"와의 충돌을 피하기 위해 이름을 "ls1"로 지정합니다.

따라서 ~/.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 ifor 루프가 위치 인수를 사용하게 됩니다.
  • 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에는 일반적으로 파일이 인수로 필요합니다 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새 터미널이나 reload bash를 실행하는 기존 터미널에서 쉽게 재사용할 수 있습니다.

관련 정보