0

からの出力を使用しmdfindて、一連のシンボリックリンクを作成しようとしています。の出力mdfindは次のようになります。

/ pathtofile1 /
/ pathtofile2 /
/ pathtofile3 /

それで、私は各行の先頭sedに追加していました、そして;ln -sawk {print $0 "/directory where I want this/"}

私の1行のスクリプトがこれを正常に出力した後:

ln -s "/ pathtofile1 /" "/ directory where I want this"
ln -s "/ pathtofile2 /" "/ directory where I want this"
ln -s "/ pathtofile3 /" "/ directory where I want this"

問題は、これを実行すると、次のエラーが発生することです:「これが必要な/ディレクトリ:ファイルが存在しません」

奇妙なことに、これらの行を個別に実行すると、リンクは期待どおりに作成されますが、コマンド全体を実行すると、上記のエラーが返されます。

何か案は?

これが私がやろうとしていることを行うための理想的な方法だとは思わないので、もっと良い解決策があれば教えてください。


詳細情報で編集。

#! /bin/bash
itemList=`mdfind -s "$1"| awk '{ print "ln -s \""$0"\" \"/Users/username/Local/Recent\""}'`
echo "$itemList"
`$itemList`

$ 1は、ファイルのリストを返すテスト*.savedSearchです。

私の結果(エコーから)は次のとおりです。

ln -s "/Users/username/Dropbox/Document.pdf" "/Users/username/Local/Recent"
ln -s "/Users/username/Dropbox/Document2.pdf" "/Users/username/Local/Recent"

そして、私が得るエラーは次のとおりです。

ln: "/ Users / username / Local / Recent":そのようなファイルまたはディレクトリはありません

ただし、各行のコピー貼り付けを個別に実行すると、リンクは期待どおりに作成されます。

4

2 に答える 2

1

シンプルに保つ1つの方法:

mdfind -0 "query" | ( cd "/Users/username/Local/Recent" ; xargs -0 -I path ln -s path . )

もちろん、これは重複したファイル名などを処理しません。

編集:

ソリューションが失敗する理由は、最初に の内容が$itemList1 つの長いコマンドとして実行されていること (つまり、awk によるライン フィード出力が無視されていること) と、次に引用符の削除の前にコマンド置換が行われていることです。実際に処理されるものは、次のものとほぼ同等です。

ln '-s' '"/pathtofile1/"' '"/to"' 'ln' '-s' '"/pathtofile2/"' '"/to"' 'ln' '-s' '"/pathtofile3/"' '"/to"'

/bin/lnはこれを次のように認識します。

ln [-Ffhinsv] source_file ... target_dir

コマンドの形式を変更し、最後のパラメーターが既存のディレクトリであることを確認します。ディレクトリ名に引用符が含まれているため、このテストは失敗します。報告したエラー メッセージを注意深く書き留めて比較します。

$ ln a b c "/Users/username/Local/Recent"
ln: /Users/username/Local/Recent: No such file or directory
$ ln a b c '"/Users/username/Local/Recent"'
ln: "/Users/username/Local/Recent": No such file or directory

したがって、この話の教訓は、シェルでファイル名を扱う場合、ファイル名のシェル処理を避けるのが最も安全な解決策であり、引用符やその他の副作用 (これは大きな問題です) に対処する必要はありません。複雑な複数行のシェル コマンドを作成するxargsことは避けてください。予期しない結果が得られやすいです。

于 2009-12-18T23:37:35.830 に答える
0

実際のパス、または少なくとももっともらしいパスを例として使用すると、問題が何であるかを判断するのがはるかに簡単になりますが、それが必要な場合、ln はこれらのディレクトリを作成しません。

于 2009-12-18T22:13:56.013 に答える