さまざまなドキュメントでいっぱいの大きな「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
ユーティリティがあり、これが-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
絶対リンクの場合、readlink
このオプションは省略でき、-f
* BSDおよびOSXで使用できます。