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