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