2

ブラックリストに含まれていないすべてのファイルをあるディレクトリから別のディレクトリに移動しようとしていmissing destination file after operand after $SVNます。デバッガー情報の一部であるエラーも含まれています。ありがとう。

#!/bin/bash
clear; set -x

# here
ROOT=`pwd`

# dirs
SVN_FOLDER="${ROOT}/svn"
GIT_FOLDER="${ROOT}/git"

# blacklist
EXCLUDE=('.git' '.idea')
EXCLUDELIST=$(printf "|%s" "${EXCLUDE[@]}")
EXCLUDEDIR=`echo "${GIT_FOLDER}/!(${EXCLUDELIST:1})"`

shopt -s dotglob nullglob # see hidden

mv $EXCLUDEDIR $SVN_FOLDER

  # + mv {dir}/svn   <--- the excluded stuff is NOT in the MV cmd?
  # mv: missing destination file operand after ‘{dir}/svn’
4

3 に答える 3

2

私はこのようにそれを解決します:

#!/bin/bash

SVN_FOLDER="${ROOT}/svn"
GIT_FOLDER="${ROOT}/git"

EXCLUDE=('.git' '.idea')
EXCLUDE_PATTERN=$(IFS='|'; echo "${EXCLUDE[*]}")
EXCLUDE_PATTERN=${EXCLUDE_PATTERN//./\\.}

find "$GIT_FOLDER" -mindepth 1 -maxdepth 1 -regextype posix-egrep -not -regex ".*/(${EXCLUDE_PATTERN})$" -exec mv -i -t "$SVN_FOLDER" '{}' '+'

-iコマンドがすでに機能している場合は、オプションでコマンドからオプションを削除できますmv

于 2013-08-30T20:19:58.033 に答える
1

それが「非効率的」であることは承知していますが、大量のファイルを定期的に移動していない限り、次のような単純で適切な方法の何が問題になっているでしょうか。

blacklist=/tmp/black.lst
srcdir=foo
dstdir=bar

for f in $srcdir/*; do
    if !fgrep -qs "$f" $blacklist; then
        mv $f $dstdir
    fi
done

というか、これはどうでしょう。コンテンツをコピーする代わりにハードリンクすることで、速度の点で他のものを圧倒するに違いありません。

#!/bin/bash

root=$(pwd)
svn_dir=$root/svn
git_dir=$root/git
blacklist='.git .idea'
exclude='--exclude .svn'
for f in $blacklist; do
    exclude="$exclude --exclude $f"
done

if ! [ -e $svn_dir ]; then
    cp -al $git_dir $svn_dir
    for f in $blacklist; do
        rm -rf $svn_dir/$f
    done
fi

rsync -a $exclude $git_dir/ $svn_dir
于 2013-08-30T19:43:37.427 に答える