./なしで検索結果を使用してください。

./なしで検索結果を使用してください。

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/{}'

man find

  • -print0標準出力にフルファイル名とそれに続く1null 文字を印刷します。

man cut- ファイルの各行から部分を削除します。

  • -z行区切り文字はNUL改行文字ではありません。
  • -c次の文字のみを選択してください。
  • N-N番目のバイト、文字、またはフィールド(1から計算)から行末まで。

man xargs- 標準入力からコマンドラインを作成して実行します。

  • xargs [options] [command [initial-arguments]]
  • -0項目は空白以外の文字で終わり、引用符nullとバックスラッシュは特別ではありません(各文字は文字通り使用されます)。
  • -I replace-strreplace-strinitial-arguments標準入力から読み取った名前で項目を変更します。また、引用符のないスペースは項目を終了せず、代わりに区切り文字は改行文字です。ヒント-L 1
  • -L max-linesmax-linesコマンドラインごとの最大スペースではない入力行を使用してください。

関連情報