1

変数を含まないことを除いて、解決策がある同様の質問をいくつか見つけました。

ファイルとディレクトリのツリーに特定のパターンがあります。パターンは TEMPLATE という単語です。TEMPLATE という単語を、変数 ${newName} に含まれる別の名前に置き換えて、すべてのファイルとディレクトリの名前を変更するスクリプト ファイルが必要です。

${newName} の値が「フレッドはここに住んでいます」であることがわかっている場合、コマンドは

find . -name '*TEMPLATE*' -exec bash -c 'mv "$0" "${0/TEMPLATE/Fred lives here}"' {} \;

仕事をします

ただし、私のスクリプトが次の場合:

newName="Fred lives here"
find . -name '*TEMPLATE*' -exec bash -c 'mv "$0" "${0/TEMPLATE/${newName}}"' {} \;

TEMPLATE という単語は、「Fred lives here」ではなく null に置き換えられます。

パス名にスペースがあるため、$0 の前後に "" が必要なので、次のようなことはできません。

find . -name '*TEMPLATE*' -exec bash -c 'mv "$0" "${0/TEMPLATE/"${newName}"}"' {} \;

TEMPLATEという単語を含むすべてのファイルとディレクトリがTEMPLATEの値が何であれ置き換えられるように、このスクリプトを機能させるのを手伝ってくれる人はいます${newName}

たとえば、ifnewName="A different name"と a I had directory の

/foo/bar/some TEMPLATE directory/with files次に、ディレクトリの名前が次のように変更されます

/foo/bar/some A different name directory/with files

と呼ばれるファイルはsome TEMPLATE file名前が変更されます

some A different name file

4

2 に答える 2

2

で引用符を使用する必要があることを回避するにIFS=$'\n'は、任意の変数bash -cのサブシェルが必要です。exportこれは機能します:

#!/bin/bash
IFS=$'\n'
export newName="Fred lives here"
find . -name '*TEMPLATE*' -exec bash -c 'mv "$0" "${0/TEMPLATE/${newName}}"' {} \;

あと 2 行を気にせず、読みやすいスクリプトが必要な場合 (エクスポートは不要):

#!/bin/bash
IFS=$'\n'
newName="Fred lives here"
for file in $(find . -name '*TEMPLATE*'); do
    mv ${file} ${file/TEMPLATE/${newName}}
done
于 2013-11-05T05:15:56.093 に答える