bashでファイルを記述/タグ付けする簡単な方法


0

このようなリストができるように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をフィルタリングする必要があるため、重複が多くなり、素敵なビューを取得する必要があります。


あなたがしたいかattr、すなわち拡張属性を?
チョロバ

これはls出力ですか?あなたは-Lオプションを使用しているようです(グループまたは所有者を隠すために他のものと一緒に)。試してください/bin/ls -l
パウロ

はい、それらはからの出力であるllとして現在定義されたエイリアスls -alF私は所有権および/または属性を気にしない、
エドアルド・

回答:


1

利用可能な機能を確実に(誤)使用して、ls(オプションの有無にかかわらず)必要なことを定期的に行うことはできないと思います。lsスクリプト、関数、またはエイリアスで再定義する必要があります。

lsただし、少なくともこの例では、単純な概念実証となることを意図しておりそれ自体は再定義しません。コマンドラインスイッチをサポートlsすると、例が非常に複雑になります。

私のソリューションを実装するには、拡張属性とそれらを操作するツールをサポートするファイルシステムが必要です(たとえばapt-get install attrDebian)。

属性を設定するには:

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

ノート:

  • 私が使用し=>ていない、->後者はすでにによって使用されているため、lsシンボリックリンクのために。
  • POSIXでは、find呼び出しに少なくとも1つのパスが必要です。唯一のll(引数なしで)find失敗する可能性があります(この回答を比較してください)。その場合、に渡す.ための予備的なロジックが必要になりますfind
  • -maxdepthPOSIXでもありません。使用できない場合は、この質問を参照してください。
  • この関数は、すべての引数をfind(asとして"$@")単に渡します。これは、このカスタムllls(または一般的なllエイリアス)によって通常使用されるオプションを理解しないことを意味します。一方、テストを挿入することfindは可能です。
  • 名前またはタグの特殊文字または印刷不能文字は、予期しない出力を引き起こす可能性があります。
  • ls -dalFオブジェクトごとに個別に呼び出されるため、結果の行は通常の列に整列しない場合があります。必要なタグを除き、必要なすべての情報を印刷するのでは-printfなく、アクションを検討してください。フォーマットでタブをセパレータとして使用すると、複数行の出力が列化されます(少なくとも何らかの並べ替えが行われます)。適切なフォーマットでは必要ありません。lsgetfattr-printf-printftr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.