findを使用して複数のシンボリックリンクを作成しようとしていますが、{}で結果を使用すると、各ファイル名の前に./が含まれます。これをどのように避けることができますか?
find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
答え1
コマンドで1文字を変更するだけです。
find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
# ^
答え2
次の標準構文を使用します。
S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
for i do
ln -s -- "$S${i#.}" "$D/$i"
done' sh {} +
GNUismsを使用したい場合は、次のようにします。
find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
xargs -r0n2 ln -s
または、/sourcedir
はい現在のディレクトリ:
find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
xargs -r0n2 ln -s
答え3
find
引数として指定したパスに基づいて名前を印刷します。この場合、パスは.
すべての名前で始まります./
。絶対パスを取得するには、絶対パスを入力として提供する必要があります。
find "$PWD" -type l -name '*.h'
このコマンドは$PWD
現在の作業ディレクトリへの絶対パスを含む環境変数を使用するため、元のコマンドの意味を維持する必要があります。
答え4
find . -type l -name '*.h' -print0 | cut -z -c3- \
| xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'
-print0
標準出力にフルファイル名とそれに続く1null
文字を印刷します。
man cut
- ファイルの各行から部分を削除します。
-z
行区切り文字はNUL
改行文字ではありません。-c
次の文字のみを選択してください。N-
N番目のバイト、文字、またはフィールド(1から計算)から行末まで。
man xargs
- 標準入力からコマンドラインを作成して実行します。
xargs [options] [command [initial-arguments]]
-0
項目は空白以外の文字で終わり、引用符null
とバックスラッシュは特別ではありません(各文字は文字通り使用されます)。-I replace-str
replace-str
initial-arguments
標準入力から読み取った名前で項目を変更します。また、引用符のないスペースは項目を終了せず、代わりに区切り文字は改行文字です。ヒント-L 1
。-L max-lines
max-lines
コマンドラインごとの最大スペースではない入力行を使用してください。