0

リンクの名前に自分の文字列を追加するシンボリックリンクを作成するのを手伝ってくれる人はいますか? これが私がこれまでに持っているコードです:

find /home/folder1/*.txt -type f -exec ln -s {} \;
find /home/folder2/*.txt -type f -exec ln -s {} \;

そのコマンドはシンボリックリンクを作成するために機能しますが、リンク名に独自のテキストを追加したいと思います。これは、各フォルダーと宛先で同じファイル名を使用できるため、シンボリックに一意の名前を付ける方法を見つける必要があるためです。リンク。だから私はシンボリックリンクを次のように作成することを考えていました:

folder1_doc1.txt
folder2_doc1.txt
folder1_doc2.txt
folder2_doc2.txt

スクリプトは次のようになると思います。

find /home/folder1/*.txt -type f -exec ln -s {} "folder1_" +\;
find /home/folder1/*.txt -type f -exec ln -s {} "folder2_" + \;
4

2 に答える 2

0

ここには 3 つの問題があります。

  1. 一致したファイルの名前は{}.

  2. の名前{}は、ファイルへの完全なパスです (あなたの場合は/home/folder1/a.txt)。/ファイル名を取得するには、最後まですべてを削除する必要があります。解決策の 1 つは、文字列操作##を使用して、そこから、最大の削除と*/グロブの一致に使用する必要がある理由を調べることです。

    $ a="home/files/folder1/s"; echo $a ${a##*/}
    home/files/folder1/s s
    
  3. コンストラクト{}内では使用できません。したがって、コマンドを aを使用して同じことを行うコマンドに${...}置き換えます。find ... -exec ...for

    for file in `/home/folder1/*.txt`; do ln -s $file folder1_${file##*/}; done
    

PS: のbasename代わりに使用できるものもありますが、一部では${a##*/}使用できません。-execfind

于 2012-09-21T15:20:38.490 に答える
0

awk などのストリーム エディターを使用して、このようなことをすばやく行うことができます。例を試してください:

find /home/folder1/*.txt -type f | awk -F '.txt' '{printf "ln -s %s %s_CUSTOM_TEXT.txt\n", $0, $1}'

これにより、ターミナルで入力したい内容に近いコマンドが出力されます。awk strink をいじって、必要なことを正確に伝え、結果を sh にパイプします。

find /home/folder1/*.txt -type f | awk -F '.txt' '{printf "ln -s %s %s_CUSTOM_TEXT.txt\n", $0, $1}' | sh

この種のことを行うときは注意してください。実際に実行されたくない一連のコマンドを sh にパイプしないでください。

于 2012-09-21T20:06:53.890 に答える