web-dev-qa-db-ja.com

ディレクトリ内のすべてのシンボリックリンクを解決するには?

私のものではない上流のソースコードからdebianパッケージを作成しようとしています。著者が提供するconfigureスクリプトは、ソースディレクトリに多くのシンボリックリンクを作成します。それらは、src subdirからinclude subdirへのすべてのヘッダーへのシンボリックリンクです(そのため、makefileは開発パッケージをインストールする場合にincludeディレクトリを簡単にコピーできます)。 debhelperスクリプトを使用してパッケージを作成しています。

debhelperスクリプトを使用してパッケージを作成しています。問題は新しいdebianパッケージ形式(quilt 3.0 native)を使用しているため、debuildは最終のdiffファイルへのシンボリックリンクから成るソースディレクトリの変更を拒否します。次のようなエラーが表示されます。

dpkg-source: error: cannot represent change to foo.h:
dpkg-source: error:   new version is symlink to /ba/foo/foo.h
dpkg-source: error:   old version is nonexistent

私は良い解決策を知っています:ヘッダーをまったくシンボリックリンクしないようにconfigureスクリプトを変更します。 makefileにターゲットを追加して、develパッケージをインストールする必要があります。 configureスクリプトには著作権の問題がありますが。上流のソースに触れることはできません。

ディレクトリ内のすべてのシンボリックリンクを、それらが指す実際のファイルで置き換えるbashスクリプトを探しています。たとえば、ディレクトリdに3つのファイルabcがあり、それらが../../foo/bar/x../../foo/bar/z../../foo/bar/y、最初の引数としてmagic.shを指定する目的のスクリプト(たとえば./d)を実行し、

cp ../../foo/bar/x ./d/a
cp ../../foo/bar/y ./d/b
cp ../../foo/bar/z ./d/c

どのファイルが指すシンボリックリンクであるかを知る方法が見つかりません。

4
sorush-r

readlinkを使用します。

$ readlink /etc/alternatives/editor
/usr/bin/vim.basic

ディレクトリ内のシンボリックリンク上を歩くシェルスクリプトでラップします。

findを使用してシンボリックリンクを検索できます。

$ find . -type l

より完全な例:

#!/bin/bash

find . -maxdepth 1 -type l | while read LINE; do 
echo link: $LINE resolved: `readlink $LINE`
done

出力

link: ./.remmina resolved: sparkleshare-homedir/remmina
link: ./project resolved: Documents/2011-2 Project/
link: ./.ssh resolved: sparkleshare-homedir/ssh
4
gertvdijk