모든 폴더를 새 위치로 복사합니다(잘못된 문자가 포함된 폴더 제외).

모든 폴더를 새 위치로 복사합니다(잘못된 문자가 포함된 폴더 제외).

목적은 폴더의 모든 폴더와 파일을 새 위치로 복사하는 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각 디렉터리에 대해 한 번 호출할 필요가 없습니다.

관련 정보