web-dev-qa-db-ja.com

シンボリックリンクが存在しないファイルを一覧表示するにはどうすればよいですか?

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

したがって、ドキュメントのクラスごとに(いくつかの)他のディレクトリを作成しました。たとえば、「myfiles」ディレクトリ内の各.jpgまたは.cr2ファイルへのシンボリックリンクと、説明やその他の各シンボリックリンク(同じファイル名)の他の説明ファイルがある「images」ディレクトリがあります。メタデータ。/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
10

私が質問を正しく理解した場合、画像にシンボリックリンクがない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があり、ディレクトリimages/3または単にimages /にそのファイルへのシンボリックリンクがある場合、このアプローチには注意が必要です。ファイルにシンボリックリンクがないことは報告されません。

6
taliezin

myfilesの下のファイルはシンボリックリンクではなく、どのファイル名にも改行が含まれていないと思います。 (これらの仮定に違反しても私のアプローチは機能しますが、より複雑になります。)また、共通のreadlinkユーティリティがあり、パスを正規化するために-fをサポートしていると仮定します。 Linux(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の下のリンクが絶対的なものである場合、* BSDおよびOSXで使用できる-fオプションなしでreadlinkを使用できます。