0

スクリプトにループがあり、配列を反復処理しmyArrayます。反復ごとにファイル/ディレクトリのコピーを実行する必要があります。配列は次のようになります-

myArray=('ajax' 'style/prod_styles' `path/to/some_file.php` 'templates' 'uploadify')

この配列を使用すると、がない要素の場合、/フォルダ全体とその内容をコピーする必要があります-たとえばajax、、。ただし、スラッシュがある場合(複数のスラッシュが存在する可能性があることに注意してください)、最後の要素のみをコピーする必要があり(たとえば、その内容とその内容のみをコピーする必要がある場合)、親フォルダーが宛先に存在しない場合(たとえば、、は親フォルダです)、これらのフォルダを作成してから、最後の要素()をコピーする必要があります。templatesuploadifystyle/prod_styles/path/to/some/folderfolderpathtosomefolder

以前、ループ内で(PHPのようにexplode())展開を実行し、親(上記の例のようにディレクトリ)から再帰的に開始して、子ディレクトリが存在するかどうかを確認し、作成しない場合は、完了するまで簡単に実行できると推測しました。コピーするファイル/ディレクトリの親を使用して、最後のコピーを実行します。/path

ただし、bashでこれを行うためのより簡単な方法がある場合は、お知らせください。

ありがとう、
Sandeepan

4

3 に答える 3

2

「最後の要素のみ」が何を意味するのか、私には100%明確ではありません。このcpコマンドは、パス内の最後の項目のみを宛先にコピーします。私の推測では、宛先で相対パスを保持したいと考えています。

path=style/prod_styles
dest=/path/to/some/folder

# Create same path structure
destPath="${dest}/$(dirname "$path")"
mkdir -p "${destPath}"

# copy src folder into correct place
cp -r "$path" "${destPath}"

pathこれは、 にスラッシュが含まれていない場合にも機能することに注意してください。この場合、 をdirname返します.

パスの最後の部分だけを使用したい場合 (つまり にstyle/prod_stylesなりprod_stylesます)、特別なことをする必要はありません:

path=style/prod_styles
dest=/path/to/some/folder

mkdir -p "${dest}"

# copy src folder into correct place
cp -r "$path" "${dest}"
于 2011-01-10T10:28:53.457 に答える
2

私があなたの質問を誤解していない限り、おそらく、あなたが望むものを達成するために爆発のような機能を使用する必要はありません.

例:

# dir to copy to    
DESTINATION='/path/to/copy/to/.'

# dir to copy from
SOURCE='.' 

# list of dirs to copy
myArray=('ajax' 'style/prod_styles' 'templates' 'uploadify')

# for each directory in myArray ...
for d in "${myArray[@]}"
do
    if [ -f "$d" ]; then # it this is a regular file

        # create base directory
        mkdir -p $DESTINATION/$(dirname "$d")

        # copy the file
        cp "$SOURCE/$d" $DESTINATION/$(dirname "$d")

    elif [ -d "$d" ]; then # it is a directory

        # create directory (including parent) if it doesn't exist
        # - this does nothing if directory exists
        mkdir -p "$DESTINATION/$d"

        # recursive copy
        cp -r "$SOURCE/$d/"* "$DESTINATION/$d/."

    else 

        # write warning to stderr. do nothing with this entry
        echo "WARNING: invalid entry $d." >&2

    fi
done

アップデート:

宛先内の相対パスを維持するようにサンプル コードを更新しました。そのため、styles/prod_stylesコピーされ$DESTINATION/styles/prod_stylesますが、その中の他のすべてのものstyles/はコピーされません。

次のことを確認できない場合は、追加のチェックを追加する必要があることに注意してください。

  • DESTINATION存在するで指定されたパス
  • のすべての値myArrayが有効なディレクトリであるとは限りません (ファイルではありません)

更新 2:

通常のファイルとディレクトリを処理するようにサンプル コードが更新されました。

于 2011-01-10T10:30:38.930 に答える
0

文字列にスラッシュが含まれているかどうかをテストする 1 つの手法:

case "$var" in
  */*) echo "I have a slash" ;;
  *)   echo "no slash for me" ;;
esac
于 2011-01-10T11:18:53.100 に答える