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
. -maxdepth
POSIX도 아닙니다. 사용할 수 없는 경우 참조하세요.이 질문.- 이 함수는 단순히 모든 인수를
find
(as"$@"
)에 전달합니다. 이는 이 사용자 정의가 (또는 공통 별칭)ll
에서 일반적으로 사용되는 옵션을 이해하지 못한다는 것을 의미합니다. 반면에 테스트를 주입하는 것이 가능합니다.ls
ll
find
- 이름이나 태그에 특수 문자나 인쇄할 수 없는 문자가 있으면 예기치 않은 출력이 발생할 수 있습니다.
ls -dalF
모든 개체에 대해 개별적으로 호출되므로 결과 줄이 일반 열에 정렬되지 않을 수 있습니다. 여전히 필요한 태그를 제외하고 필요한 모든 정보를 인쇄하는-printf
대신 조치를 고려하십시오 . 형식 에서 탭을 구분 기호로 사용하면 여러 줄 출력이 열화됩니다(적어도 일종의 정렬). 적절한 형식을 사용 하면 .ls
getfattr
-printf
-printf
tr