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


10

その他のドキュメントでいっぱいの大きな「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

完全な答えではありませんが、aの結果をファイルに保存し、シンボリックリンクされたファイルのリストを取得するfind /myfiles -type fために使用find /images -type l -exec readlink {} \; | egrep myfiles/imagesて、結果sedごとに反復して、保存した最初のファイルのパスを削除することができます。シンボリックリンクがあり、残っているファイルはシンボリックリンクがないファイルです。
Bratchley 2015年

2
代わりにハードリンクを使用することは可能ですか?ハードリンクカウンターを使用して、リンクがあるかどうかを確認できますか?を使用ls -lすると、2番目の列にハードリンク数が表示されます。
Lambert

@Lambertの言うことを実行してください。rmこれらのシンボリックリンクディレクトリとpax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dir、たとえば、jpgに一致するファイルのみのプログラムで変更されたファイル名を持つハードリンクを取得するために使用します。変更時間に基づくバッチ処理など、それ以外にも多くのことが可能になります
mikeserv

回答:


6

私が質問を正しく理解した場合、画像にシンボリックリンクがない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ディレクトリを示しています。実際には、myfilesの下のイメージファイルは、任意のレベルのネストされたディレクトリ内に置くことができます。
Robert Alexander

私はmyfiles全体を検索するように回答を編集しましたが、これが希望どおりかどうかを確認します。
taliezin

ALMOST there :-)ファイルにスペース(および単一のアポストロフィなどの他のがらくた)が含まれていると、スクリプトが途切れてしまいます...
Robert Alexander

今は大丈夫だと思います
taliezin

最後の変更は、すべての文字nの出現時にすべてのfを分割します。:-) IFS行をIFS =、次にキーボードからの改行、次に別の行に移動しました。分割は機能しているようですが、「missinglinks.sh:11:missinglinks.sh:[[:not found "
ロバートアレクサンダー

3

下のファイル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で利用可能なオプションなしで使用できます。


私はあなたのcomm命令のようなものを投稿しようとしていましたが、あなたがすでにしたことを私は今見ません。ただし、からのリダイレクトsortは意味がありません。その場合、プロセス置換は何も出力しません。また、以外のいくつかのディレクトリのいずれかからシンボリックリンクされていない/imagesファイルを検索する場合は、の横に多くのディレクトリを追加できます。/myfiles/images
tripleee、2015年

1
代替手段については、stackoverflow.comreadlink -f
questions / 7665 /…

@tripleeeプロセスリダイレクトバージョンをビルドしたときに、リダイレクトを削除するのを忘れていました。はい、他のディレクトリを簡単に追加したり、他のバリエーションを作成したりできます。
Gilles「SO-邪悪なことをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.