Shell Scripting:复制子目录中的所有丢失文件

时间:2013-08-30 13:01:41

标签: bash shell unix

givenFolder将包含子文件夹。每个子文件夹应该有36个文件,其格式如下:<subfoldername>_<xx>.png(例如abc_09.png,abc_10.png等)如果缺少36个文件(01到36)中的任何一个,则通过复制1x1在该文件夹中创建它。 png作为该文件,例如如果缺少abc_01.png,则将1x1.png复制为该子文件夹中的abc_01.png,以便最后每个子文件夹应包含所有36个编号的文件。 假设1x1.png的硬编码位置。

到目前为止,我能够做到这一点:

#!/bin/bash

#list all sub directories and files under it
if [ ! -z "$1" ] 
  then
    echo "Arguments passed";
    if [ -d "$1" ]
    then    
        tree -if --noreport "$1";
    else        
        echo "Supplied argument is not a directory";
    fi
else
    echo "No arguments passed";
fi

但我不知道如何前进。

2 个答案:

答案 0 :(得分:4)

DEFAULT_PNG='/path/to/your/1x1.png'

if [[ $1 ]]; then
    echo "Arguments passed";

    if [[ -d $1 ]]; then    

        for curFile in "$1/"abc_{01..36}.png; do
            if ! [[ -f $curFile ]]; then
                cp -- "$DEFAULT_PNG" "$curFile"
            fi
        done

    else        
        echo 'Supplied argument is not a directory';
    fi
else
    echo 'No arguments passed';
fi

了解bash brace expansion

在你编辑了你的问题后,我开始明白你想要一些不同的东西...所以,如果我这次做得对,这里有一个适用于子文件夹的脚本

DEFAULT_PNG='/path/to/your/1x1.png'

if [[ $1 ]]; then
    echo "Arguments passed";
    if [[ -d $1 ]]; then

        for curSubdir in "$1/"*; do 
            if [[ -d $curSubdir ]]; then #skip regular files
                dirBasename=$(basename -- "$curSubdir")
                for curFile in "$curSubdir/$dirBasename"_{01..36}.png; do
                    if ! [[ -f $curFile ]]; then
                        cp -- "$DEFAULT_PNG" "$curFile"
                    fi
                done

            fi
        done

    else        
        echo 'Supplied argument is not a directory'
    fi
else
    echo 'No arguments passed'
fi

答案 1 :(得分:1)

我知道一个好的答案已经被接受了,但是我对这个问题的初步解读使得它意味着givenFolder的子文件夹可能会扩展到更加任意的深度,并且是脚本的直接参数(“givenFolder” “s)没有填充PNG文件。所以这就是看起来的样子。

向@ Aleks-Daniel致敬,提醒我使用bash的漂亮支撑扩展。

#!/bin/bash

[ $# -ge 1 ] || exit 0

DEF_PNG='/tmp/1x1.png'

[ -f "$DEF_PNG" ] || ppmmake black 1 1 | pnmtopng > "$DEF_PNG" || exit 1

function handle_subdir() {
  [ -d "$1" ] || return

  local base=$(basename "$1")
  local png

  for png in "$1"/"$base"_{01..36}.png; do
    [ -e "$png" ] || cp "$DEF_PNG" "$png"
  done
}

# Only process subdirectories of the directory arguments to
# the script, but do so to an arbitray depth.
#
find "$@" -type d -mindepth 1 | while read dir; do handle_subdir "$dir"; done

exit $?

如果子文件夹是由对手创建的并且包含\ n个字符,则管道查找输出到bash的read命令会产生不良行为。然而,快速测试显示它可以正确处理文件夹/目录名称中的其他特殊字符(空格,$,*等)。