すべてのフォルダを新しい場所にコピーします(無効な文字を含むフォルダを除く)。

すべてのフォルダを新しい場所にコピーします(無効な文字を含むフォルダを除く)。

目的は、フォルダ内のすべてのフォルダとファイルを新しい場所にコピーするBashスクリプトを作成することです。

コピーされるフォルダ名は、常に次の形式に従う必要があります。

37ee0500-52c0-4a18-861e-0084EF05FB

フォルダは次の場所にあり、/user/members/local/次の場所にコピーする必要があります/user/members/clean/

次のスクリプトが書かれていますが、どちらも目的には合いません。

スクリプト1:

#!/bin/bash
echo $1;

if [[ "$1" =~ [^0-9A-Za-z]+ ]] ; then
echo "string $1 has characters which are not alphanumeric"
else
echo "string $1 has alphabets which are only alpha numeric"
fi

出力:

./test: line 5: conditional binary operator expected
./test: line 5: syntax error near `=~'
./test: line 5: `if [[ "$1" =~ [^0-9A-Za-z]+ ]] ; then'

スクリプト2

if grep '^[-0-9a-zA-Z]*$' <<<$1 ;
  then echo ok;
    else echo ko;
    fi

出力:

./test 37ee0500-52c0-4a18-861e-0084EF05FB返し、期待okどおりに失敗します./test 37ee0500-5@c0-4#18-861e-00-0P{9F05FB

修正する: これはうまくいきます。

#!/bin/bash

NEW="/user/members/local";
OLD="/user/members/clean";

mv $NEW $OLD;
mkdir $NEW;

cd $OLD;

for f in *; do 

if grep '^[-_.0-9a-zA-Z]*$' <<< "$f" ; 
  then echo $f OK; cp -ar $f $NEW/$f;
     else echo $f Failed;              
fi

done

答え1

findBusyBoxなどではなくGNUユーティリティを搭載したLinuxシステムを使用している場合は、次の方法でこれを非常に効率的に実行できますcp

find /src -maxdepth 1 -type d -regex '.*/[0-9A-Za-z-]+$' -exec cp -r -t /dst {} +

これは/src、最上位レベルに英数字またはハイフンのみが含まれているすべてのディレクトリを見つけ、それをすべて渡して再帰的cpにコピーします/dst。このオプションを使用すると、「ターゲットディレクトリ」を最初に指定できるため、残りの-tすべてcpの引数はコピーしたいエントリになります。プロジェクト。これにより、findの{} +コンストラクタを使用して、できるだけ多くのコンストラクタを単一のcp呼び出しに渡すことができます(と同様xargs)。これにより、コピーするディレクトリが多い場合は、cp各ディレクトリに対して一度呼び出す必要がなくなります。

関連情報