シンボリックリンクが存在しないファイルを一覧表示するには?

シンボリックリンクが存在しないファイルを一覧表示するには?

さまざまなドキュメントでいっぱいの大きな「myfiles」ディレクトリがあり、その構造を変更したくありません。

したがって、各文書タイプに対して(複数の)異なるディレクトリを作成しました。たとえば、「myfiles」ディレクトリ内の各ファイルのシンボリックリンクと、説明と他のメタデータとともに、各シンボリックリンク(同じファイル名を使用)の異なる説明ファイルを含む「images」ディレクトリがあります.jpg.cr2/ imagesディレクトリのシンボリックリンクは、元のリンクファイルと名前が異なる場合があります。

私は、「myfiles」ディレクトリにあるすべての画像ファイルに「images」ディレクトリへのシンボリックリンクを持たせる最も簡単な方法を見つけようとしています。

フォルダ構造の例を見る

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

結果が出なければならない

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

答え1

質問を正しく理解したら、イメージにシンボリックリンクがないmyfilesのファイルが必要です。

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

この方法では、myfiles / 1ディレクトリにa.jpgファイルがあり、image / 3または単にimage /ディレクトリにそれを指すシンボリックリンクがある場合は警告が表示され、そのファイルはシンボリックリンクが見つからないと報告されません。

答え2

myfiles以下のファイルはシンボリックリンクではなく、ファイル名に改行文字が含まれていないとします。 (これらの仮定に違反しても、私のアプローチは依然として機能しますが、より複雑になります。)また、汎用readlinkユーティリティがあり、これが-fLinux(GNUとBusyBox)の場合であるフルパスをサポートしているとします。たとえば、OSXにはありません。

より良い測定のためにファイルリストを作成してソートします。

find /myfiles -type f -print | sort >all.list

絶対パスを使用してシンボリックリンクターゲットリストを作成します。

find /images -type f -exec readlink -f {} \; | sort >linked.list

リンクされていないファイルのリスト:

comm -32 all.list linked.list

プロセス置換をサポートするシェルを使用している場合は、すべてを1つのコマンドに入れることができます。

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

以下のリンクが/images絶対リンクの場合、readlinkこのオプションは省略でき、-f* BSDおよびOSXで使用できます。

関連情報