Bash复制包含与模式匹配的内容的所有目录

时间:2015-09-07 12:20:34

标签: regex linux bash grep sh

是否有某种方法可以使用bash脚本复制包含内容的目录。例如

// Suppose there are many directory inside Test in c as,
   /media/test/
        -- en_US
                -- file1
                -- file 2 
        -- de_DE 
               -- file 1
               -- SUB-dir1
                  -- sub file 1
               -- file 2
               .....
               .....
        -- Test 1
              --  testfile1
              -- folder
                   --- more 1  
         ............

NoW i want to copy all the directories (including sub-directory and files)
to another location which matches the pattern.
--> for example , in above case I want the directories en_US and de_DE to be copied in another
location including sub-directories and files. 

到目前为止,我已经完成/发现:

1)需要的模式为/b/w{2}_/w{2}/b

2)我可以列出所有目录,

$MYDIR="/media/test/"
DIRS=`ls -l $MYDIR | egrep '^d' | awk '{print $10}'`
for DIR in $DIRS
do
echo  ${DIR}
done

现在我需要帮助将这些组合在一起,以便脚本可以将与​​模式匹配的所有目录(包括子内容)复制到另一个位置。

提前致谢。

3 个答案:

答案 0 :(得分:2)

我不确定你的环境,但我想你试着这样做:

procedure TForm1.Button1Click(Sender: TObject);
begin
  cxDateEdit.DroppedDown := True;
end;

答案 1 :(得分:2)

有选择地将整个目录结构复制到类似的目录结构,同时过滤内容,一般来说,最好的办法是归档原始目录并取消归档。例如,使用GNU Tar:

$ mkdir destdir
$ tar -c /media/test/{en_US,de_DE} | tar -C destdir -x --strip-components=1

在此示例中,/media/test目录结构在destdir下部分重新创建,不包括/media前缀(感谢--strip-components=1)。

左侧tar仅存档与我们指定的模式匹配的目录/路径。存档在该命令的标准输出上生成,该输出通过管道传送到右侧的解码tar-C告诉它更改为目标目录。它在那里提取文件,删除前导路径组件。

$ ls destdir
test
$ ls destdir/test
en_US de_DE

当然,使用cp -a

可以轻松处理您的具体示例测试用例
$ mkdir destdir
$ cp -a /media/test/{en_US,de_DE} destdir

如果模式很复杂,涉及在源目录层次结构的更深层和/或不同层次上多次选择子树材质,那么如果您希望在单个批处理命令中执行复制,则需要更通用的方法指定源模式。

答案 2 :(得分:-1)

请检查这是否是您想要的。它搜索格式为xx_yy / ab_cd /&& _ $$(2char_2char)的目录,并将内容复制到新目录。

usage : ./script.sh

cat script.sh

#!/bin/bash

MYDIR="/media/test/"
NEWDIRPATH="/media/test_new"
DIRS=`ls -l $MYDIR | grep "^d" | awk '{print $9}'`
for DIR in $DIRS
do
        total_characters=`echo $DIR | wc -m`
        if [ $total_characters -eq 6 ]; then
                has_underscore=`echo "$DIR" | grep "_"`
                if [ "$has_underscore" != "" ]; then
                        echo "${DIR}"
                        start_string_count=`echo $DIR | awk -F '_' '{print $1}' | wc -m`
                        end_string_count=`echo $DIR | awk -F '_' '{print $2}' | wc -m`
                        echo "start_string_count => $start_string_count ; end_string_count => $end_string_count"
                        if [ $start_string_count -eq 3 ] && [ $end_string_count -eq 3 ]; then
                                mkdir -p $NEWDIRPATH/"$DIR"_new
                                cp -r $DIR $NEWDIRPATH/"$DIR"_new
                        fi
                fi
        fi
done