将所有文件夹复制到新位置(包含无效字符的文件夹除外)

将所有文件夹复制到新位置(包含无效字符的文件夹除外)

目的是创建一个 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为每个目录调用一次。

相关内容