Bash에서 파일을 설명/태그하는 간단한 방법

Bash에서 파일을 설명/태그하는 간단한 방법

bash에서 파일에 태그를 지정하는 빠르고 간단한 방법이 있습니까?

-rw------- 1 root   88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root  248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990
-rw------- 1 root  293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root  120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC
-rw------- 1 root   20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root   11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C
-rw------- 1 root    1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C

이와 같은(또는 유사한) 것이 됩니다.

-rw------- 1 root   88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root  248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990 -> MYOLDFILE1
-rw------- 1 root  293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root  120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC -> MYNEWFILE.TXT
-rw------- 1 root   20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root   11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C -> hello.c
-rw------- 1 root    1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C

나는 뭔가를 시도했지만 ln -s링크가 동일한 디렉토리에 있기 때문에 많은 중복으로 끝나고 멋진 보기를 얻으려면 grep으로 ls를 필터링해야 합니다. 도움을 주시면 감사하겠습니다.

답변1

나는 사용 가능한 기능을 안정적으로 (잘못) 사용하여 ls(옵션 유무에 관계없이) 원하는 작업을 수행할 수 없다고 생각합니다. ls스크립트, 함수 또는 별칭을 사용하여 재정의해야 합니다 .

ls하지만 적어도 이 예에서는 그 자체를 재정의하지 않을 것입니다 .간단한 개념 증명. 명령줄 스위치를 지원하면 ls예제가 지나치게 복잡해집니다.

apt-get install attr내 솔루션을 구현하려면 확장된 속성을 지원하는 파일 시스템과 이를 조작하기 위한 도구(예 : Debian) 가 필요합니다 .

속성을 설정하려면 다음을 수행하십시오.

setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C"

참고: mytag임의의 이름입니다. 하나를 선택하고 그것에 충실하십시오.

속성을 제거하려면 다음을 수행하십시오.

setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C"

이러한 작업을 보다 편리한 방법으로 수행하기 위해 사용자 정의 스크립트나 함수를 작성할 수 있습니다. 이제 ll당신이 원하는 것을 하기로 선택했다고 가정해보자 . 별칭인 경우 먼저 별칭을 해제해야 합니다.

unalias ll

그런 다음 함수를 정의합니다.

function ll() { find "$@" -maxdepth 1 -exec \
   sh -c '
      a=$(getfattr -n user.mytag --only-values "$1" 2>/dev/null)
      ls -dalF -- "$1" | tr -d "\n"
      if [ -z "$a" ]; then printf "\n"; else printf " => %s\n" "$a"; fi
   ' sh {} \;
}

사용 예:

ll   # but see notes below
ll 8C8C190C-5340-421C-96D1-D4111C5E062C
ll /bin
ll foo.txt bar.txt

예제 출력:

-rw------- 1 root root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C => hello.c

노트:

  • 나는 =>, not 을 사용했습니다 ->. 왜냐하면 후자는 이미 ls심볼릭 링크에 사용되었기 때문입니다.
  • POSIX 호출에는 하나 이상의 경로가 필요합니다 find. 단독 ll(인수 없음)은 find실패할 수 있습니다(비교이 답변). 그렇다면 .에 전달할 몇 가지 예비 논리가 필요합니다 find.
  • -maxdepthPOSIX도 아닙니다. 사용할 수 없는 경우 참조하세요.이 질문.
  • 이 함수는 단순히 모든 인수를 find(as "$@")에 전달합니다. 이는 이 사용자 정의가 (또는 공통 별칭) ll에서 일반적으로 사용되는 옵션을 이해하지 못한다는 것을 의미합니다. 반면에 테스트를 주입하는 것이 가능합니다.lsllfind
  • 이름이나 태그에 특수 문자나 인쇄할 수 없는 문자가 있으면 예기치 않은 출력이 발생할 수 있습니다.
  • ls -dalF모든 개체에 대해 개별적으로 호출되므로 결과 줄이 일반 열에 정렬되지 않을 수 있습니다. 여전히 필요한 태그를 제외하고 필요한 모든 정보를 인쇄하는 -printf대신 조치를 고려하십시오 . 형식 에서 탭을 구분 기호로 사용하면 여러 줄 출력이 열화됩니다(적어도 일종의 정렬). 적절한 형식을 사용 하면 .lsgetfattr-printf-printftr

관련 정보