目的是创建一个 Bash 脚本,将文件夹中的所有文件夹和文件复制到新位置。
进行复制的文件夹名称应始终符合以下格式:
37ee0500-52c0-4a18-861e-0084EF05FB
文件夹位于:/user/members/local/
并应复制到:/user/members/clean/
。
已创建以下脚本,但这些脚本均未达到目的。
脚本一:
#!/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'
脚本二
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
如果您使用的是带有 GNU 实用程序的 Linux 系统(而不是 BusyBox 或其他东西),您可以使用 和 非常有效地完成此find
操作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
为每个目录调用一次。