さまざまなドキュメントでいっぱいの大きな「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
私が質問を正しく理解した場合、画像にシンボリックリンクがない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 /にそのファイルへのシンボリックリンクがある場合、このアプローチには注意が必要です。ファイルにシンボリックリンクがないことは報告されません。
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
を使用できます。