目的は、フォルダ内のすべてのフォルダとファイルを新しい場所にコピーする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
find
BusyBoxなどではなく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
各ディレクトリに対して一度呼び出す必要がなくなります。