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ですが、リンクが同じディレクトリにあるため、重複が多くなり、見栄えを良くするためには ls を grep でフィルタリングする必要があります。どなたか助けていただければ幸いです。

答え1

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

lsしかし、少なくともこの例では、再定義はしません。シンプルな概念実証のコマンド ライン スイッチをサポートすると、ls例が過度に複雑になります。

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

属性を設定するには:

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

注:mytagは任意の名前です。 1 つ選択して、それに従います。

属性を削除するには:

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では、呼び出しに少なくとも1つのパスが必要ですfindll引数なしの単独呼び出しでは失敗する可能性がありますfindこの答え.)。そうであれば、に渡すための予備的なロジックが必要になりますfind
  • -maxdepthPOSIXでもありません。使用できない場合は、この質問
  • 関数は、すべての引数をfind(として"$@") に渡すだけです。つまり、このカスタムは(または一般的なエイリアス)llで通常使用されるオプションを理解しません。一方、 にテストを挿入することは可能です。lsllfind
  • 名前やタグに特殊文字や印刷できない文字が含まれていると、予期しない出力が発生する可能性があります。
  • ls -dalFは各オブジェクトに対して個別に呼び出されるため、結果の行が通常の列に揃わない場合があります。の-printf代わりに action を使用してls、 を必要とするタグ以外の必要な情報をすべて印刷することを検討してくださいgetfattr。 format でタブを区切り文字として使用すると、-printf複数行の出力が列化されます (少なくともある程度は)。適切な-printfformat では は必要ないことに注意してくださいtr

関連情報